微信公众号支付 流程

1.支付参数准备(图就不上了)

公众号的APPID、商户号MchID、商户API支付秘钥(商户平台的账户中心下:需要用户自行下载证书及安装)。

2.平台配置

商户平台-->产品中心-->开发配置-->支付配置-->公众号支付:支付授权目录(该路径需要通过备案)


点击添加


公众号配置:参见官方支付文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3

注意:以上的授权网址必须通过备案,最好开头都是统一的。比如:http://www.xxx.com/

3.参数配置

官方文档写的很详细了https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

需要的参数

/** 
     * 支付 
     * appid            应用ID      是   String(32)  wxd678efh567hg6787                      微信开放平台审核通过的应用APPID 
     * mch_id           商户号          是   String(32)  1230000109                              微信支付分配的商户号 
     * nonce_str        随机字符串   是   String(32)  5K8264ILTKCH16CQ2502SI8ZNMTM67VS        随机字符串,不长于32位。推荐随机数生成算法 
     * sign             签名             是   String(32)  C380BEC2BFD727A4B6845133519F3AD6        签名,详见签名生成算法 
     * body             商品描述      是   String(128) 腾讯充值中心-QQ会员充值                       商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。 
     * out_trade_no     商户订单号   是   String(32)  20150806125346                          商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。详见商户订单号 
     * total_fee        总金额          是   Int         888                                     订单总金额,单位为分,详见支付金额 
     * spbill_create_ip 终端IP     是   String(16)  123.12.12.123                           用户端实际ip 
     * notify_url       通知地址     是   String(256) http://www.weixin.qq.com/wxpay/pay.php  接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。 
     * openid           用户标识String(128)  是  oUpF8uMuAJO_M2pxb1Q9zNjWeS6o    
     * trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换 
     * @throws Exception  
     */  
获取openId的可以去我的另一篇博客:静默式获取 https://blog.csdn.net/qq_38423105/article/details/80632397

这边有个细节就是签名要最后签,把其余参数都带上,代码如下:

Map<String, String> data = new HashMap<String, String>();
data.put("appid", config.getAppID());                //公众号APPID
data.put("mch_id", config.getMchID());               //商户号
data.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
data.put("out_trade_no", outTradeNo);                //订单号
data.put("body",body);                               //商品描述
data.put("total_fee", "1");                          //支付金额,以分为单位
data.put("spbill_create_ip", getIpAddr(request));    //用户实际ip
data.put("notify_url", WXpayConfig.NOTIFY_URL);      //支付回调地址,可以写你执行完支付想要执行的代码,比如做支付记录,交易记录
data.put("trade_type", "JSAPI");                     //支付类型
data.put("openid", openId);                          //openId
data.put("sign", WXPayUtil.generateSignature(data,config.getKey())); //将上述信息和支付秘钥生成签名

4.统一下单

调用微信自带的工具类WXPay, 可以打印看看有没有成功

Map<String, String> resp = wxpay.unifiedOrder(data);
System.out.println("\n==========>统一下单resp:" + resp);

5.返回给前端调起微信公众号支付的参数

注意:需要二次签名,公众号支付的要求

Map<String, String> resultMap = new LinkedHashMap<String, String>();
resultMap.put("appid", config.getAppID());					// 应用ID
resultMap.put("partnerid", config.getMchID());					// 商户号
resultMap.put("prepayid", resp.get("prepay_id"));				// 预支付交易会话ID
resultMap.put("package", "Sign=WXPay");						// 扩展字段
resultMap.put("noncestr", WXPayUtil.generateNonceStr());			// 随机字符串
resultMap.put("timestamp", String.valueOf(System.currentTimeMillis()/1000));	// 时间戳
resultMap.put("sign", WXPayUtil.generateSignature(resultMap, config.getKey()));	// 签名
resultMap.put("mweb_url", resp.get("mweb_url"));                                //调用支付地址
System.out.println("\n==========>调起支付resp:" + resultMap);

6.前端页面调起支付

引入wx的JS-SDK的js文件

function onBridgeReady(){  
      WeixinJSBridge.invoke( 'getBrandWCPayRequest', {  
          "appId":appId,     //公众号名称,由商户传入       
          "timeStamp":timeStamp,         //时间戳,自1970年以来的秒数       
          "nonceStr":nonceStr, //随机串       
          "package":package,       
          "signType":signType,         //微信签名方式:       
          "paySign":paySign //微信签名   
         },   
         function(res){        
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {  
                 console.log('支付成功');  
                 //支付成功后跳转的页面  
             }else if(res.err_msg == "get_brand_wcpay_request:cancel"){  
               console.log('支付取消');  
             }else if(res.err_msg == "get_brand_wcpay_request:fail"){  
               console.log('支付失败');  
                 WeixinJSBridge.call('closeWindow');  
             } //使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。  
   });     
}  

结束!!!

还不会的可以去我的资源下载:https://download.csdn.net/download/qq_38423105/10496016

猜你喜欢

转载自blog.csdn.net/qq_38423105/article/details/80789991