微信公众号支付 流程

柔情只为你懂 2022-05-22 12:15 578阅读 0赞

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

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

2.平台配置

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

70

点击添加

70 1

公众号配置:参见官方支付文档
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

需要的参数

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

获取openId的可以去我的另一篇博客:静默式获取 https://blog.csdn.net/qq_38423105/article/details/80632397

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

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

4.统一下单

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

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

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

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

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

6.前端页面调起支付

引入wx的JS-SDK的js文件

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

结束!!!

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

发表评论

表情:
评论列表 (有 0 条评论,578人围观)

还没有评论,来说两句吧...

相关阅读

    相关 公众支付

    先说下我的需求。我有两个公众号(不是订阅号,订阅号无法向公众号支付)分别为A和B,现在我关注公众号A,在公众号A中需要发起公众号B的支付,也就是说我在公众号A中向公众号B支付钱

    相关 公众支付

    最重要:公众号必须有支付权限 具体如何查看请百度 先配置一下 否则开发很蛋疼 楼主这几天都在蛋疼中 1.在公众号中获取 appid, mch