基于weixin-java-tools集成微信小程序支付功能

目前,公司正在把业务从公众号向小程序迁移,本人负责订单功能的开发,现在把微信小程序接入微信支付这块的知识分享给大家,可能有部分人对微信支付不太了解,可以参考下面的微信支付流程图。

 

微信支付流程图

基于weixin-java-tools集成微信小程序支付功能_第1张图片

 

 

我是用weixin-java-tools这个开源框架做的,目前这个开源社区还很活跃,有兴趣的朋友可以研究一下。weixin-java-tools微信支付功能集成如下:

 

  1. 登录小程序平台设置常用的配置,request合法域名,uploadFile合法域名,downloadFile合法域名。

基于weixin-java-tools集成微信小程序支付功能_第2张图片

 

2.小程序开通微信支付功能,微信支付用到微信支付商户号,支付证书。

 

 

3.引入maven坐标


    com.github.binarywang
    weixin-java-pay
    3.2.0

 

4.调用微信统一下单接口,我这里贴出关键代码。

@RequestMapping(value="/unifiedOrder/{appId}")
public JSONObject unifiedOrder (@RequestBody JSONObject inData,@PathVariable String appId){
    String openId = inData.getString("openId");//微信用户openId
    String tradeNo = inData.getString("tradeNo");//订单编号
    Integer totalFee = inData.getInteger("orderPrice");
    //商品价格,单位为分
    String body = inData.getString("body"); //商品名称
    String ip = inData.getString("ip");//客户端ip 


    String notifyUrl = environment.getProperty("spring."+appId+".notifyUrl");//微信回调业务接口地址
    
    WxPayUnifiedOrderRequest prepayInfo = new WxPayUnifiedOrderRequest();


    long now = System.currentTimeMillis();
    String nowStr = String.valueOf(now);
    int length = nowStr.length();
    String current = nowStr.substring(length-5,length);


    prepayInfo.setOpenid(openId);
    prepayInfo.setTradeType("JSAPI");
    prepayInfo.setTotalFee(totalFee);
    prepayInfo.setBody(body);
    prepayInfo.setSpbillCreateIp(ip);
    prepayInfo.setOutTradeNo(tradeNo+"|"+current);
    prepayInfo.setNotifyUrl(notifyUrl);


    JSONObject jsObj = new JSONObject();
    try {
        final WxPayService payService = WeixinServiceFactory.getWxPayService(appId,environment);
        Object payInfo = payService.createOrder(prepayInfo);
        jsObj.put("code", ResponseCodeEnum.RESPONSE_CODE_SUCCESS.getCode());
        jsObj.put("message",ResponseCodeEnum.RESPONSE_CODE_SUCCESS.getMessage());
        jsObj.put("data", payInfo);
    } catch (WxPayException e) {
        logger.error("创建订单支付信息,出现异常",e);
        jsObj.put("code", ResponseCodeEnum.RESPONSE_CODE_INTERNAL_ERROR.getCode());
        jsObj.put("message",ResponseCodeEnum.RESPONSE_CODE_INTERNAL_ERROR.getMessage());
    }
    return jsObj

接口返回数据格式如下:

{
  "code": 200,
  "data": {
    "appId": "12123123123123",//微信小程序appid
    "timeStamp": "1559713220",//当前时间戳
    "nonceStr": "1559713220240",//随机字符串
    "packageValue": "prepay_id=wx01231231231231230",//prepay_id为预支付交易会话标识
    "signType": "MD5",//支付签名方式
    "paySign": "213213123123"//支付签名
  },
  "message": "SUCCESS"
}

 

4.小程序页面发起微信支付请求,参数为第三步返回的参数

    wx.requestPayment({
        "appId": 'wx00000000000000',//小程序appId
        "timeStamp": "",//当前时间戳 
        "nonceStr": "",//随机字符串
        "package": "",//预支付交易会话标识 取接口返回端的packageValue字段
        "signType": "",
        "paySign":"",
        //小程序微信支付成功的回调通知  
        'success': function (res) {
        
        },
        //小程序支付失败的回调通知  
        'fail': function (res) {
        
        }  
    })  
  }

 

5.微信支付平台异步回调业务接口,修改订单支付状态

你可能感兴趣的:(微信)