zoukankan      html  css  js  c++  java
  • 微信支付(java版本)_统一下单

    最近工作接触到微信支付,刚开始解决微信支付很神秘,接触之后发现并没有那么神秘,就是有很多坑,在开发的时候需要注意,整理出来:

    1.准备工作

    首先需要登录微信支付公众平台阅读接口文档,地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_12&index=2 ;

    其次了解微信支付商户系统和微信支付系统主要交互说明:

    步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

    步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

    步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

    步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明

    步骤5:商户后台接收支付通知。api参见【支付结果通知API

    步骤6:商户后台查询支付结果。,api参见【查询订单API

    然后是微信支付交互过程


    2.开始工作

    不需要导入微信支付的jar包,需要哪些jar导入哪些就可以,

    发送统一下单请求调用:

    /**

    * @方法名称:sendWxPayRequest
    * @内容摘要: <发送统一下单请求>
    * @param body
    * @param outTradeNo
    * @param totalFee
    * @param spBillCreateIP
    * @return 
    * String
    * @exception 
    * @author:鹿伟伟
    * @创建日期:2016年2月19日-下午2:24:05
    */
    public String sendWxPayRequest(String body,String detail,String outTradeNo,int totalFee,String spBillCreateIP
        )
    {
    // 构造HTTP请求
    HttpClient httpclient = new HttpClient();
    PostMethod postMethod = new PostMethod(Configure.PAY_API);
    WxPayReqData wxdata = new WxPayReqData(body,detail,outTradeNo,totalFee,spBillCreateIP);
    StringBuffer requestStr = new StringBuffer(
    "<xml>");
    requestStr.append("<appid><![CDATA[");
    requestStr.append(wxdata.getAppid());
    requestStr.append("]]></appid>");
    requestStr.append("<body><![CDATA[");
    requestStr.append(wxdata.getBody());
    requestStr.append("]]></body>");
    requestStr.append("<mch_id><![CDATA[");
    requestStr.append(wxdata.getMch_id());
    requestStr.append("]]></mch_id>");
    requestStr.append("<nonce_str><![CDATA[");
    requestStr.append(wxdata.getNonce_str());
    requestStr.append("]]></nonce_str>");
    requestStr.append("<notify_url><![CDATA[");
    requestStr.append(wxdata.getNotify_url());
    requestStr.append("]]></notify_url>");
    requestStr.append("<out_trade_no><![CDATA[");
    requestStr.append(wxdata.getOut_trade_no());
    requestStr.append("]]></out_trade_no>");
    requestStr.append("<spbill_create_ip><![CDATA[");
    requestStr.append(wxdata.getSpbill_create_ip());
    requestStr.append("]]></spbill_create_ip>");
    requestStr.append("<total_fee><![CDATA[");
    requestStr.append(wxdata.getTotal_fee());
    requestStr.append("]]></total_fee>");
    requestStr.append("<trade_type><![CDATA[");
    requestStr.append(wxdata.getTrade_type());
    requestStr.append("]]></trade_type>");
    requestStr.append("<sign><![CDATA[");
    requestStr.append(wxdata.getSign());
    requestStr.append("]]></sign>");
    requestStr.append("</xml>");
    // 发送请求
    String strResponse = null;
    try {
    RequestEntity entity = new StringRequestEntity(
    requestStr.toString(), "text/xml", "UTF-8");
    postMethod.setRequestEntity(entity);
    httpclient.executeMethod(postMethod);
    strResponse = new String(postMethod.getResponseBody(), "utf-8");
    Logger.getLogger(getClass()).debug(strResponse);
    } catch (HttpException e) {
    Logger.getLogger(getClass()).error("sendWxPayRequest", e);
    } catch (IOException e) {
    Logger.getLogger(getClass()).error("sendWxPayRequest", e);
    } finally {
    postMethod.releaseConnection();
    }
    return strResponse;
    }

    3.问题:

    客户端调起微信支付接口是一直返回-1:

    a.你要用验证过的keystore打包出来安装才能正常进入支付,否则不能进入微信,有可能出现-1的情况;
    b.你的手机确认要有安装微信app;


  • 相关阅读:
    Linux 安装SonarQube
    Linux 安装postgresql
    如何为chrome浏览器设置socks5代理
    echarts tab切换宽度变为100px解决方案
    将url参数转为对象
    一行js代码实现时间戳转时间格式
    解决问题的方法论
    李笑来的幻灯课
    随便写写(最近更新于2021/07/18早)
    谈谈装系统这件事
  • 原文地址:https://www.cnblogs.com/luweiwei/p/5320811.html
Copyright © 2011-2022 走看看