Java 微信公众号支付签名失败解决方案
引言
在开发微信公众号支付功能时,签名失败是一个常见的问题。本文将为刚入行的开发者介绍解决这个问题的具体步骤,包括整个流程的梳理、每一步需要做什么以及具体的代码实现。
流程图
flowchart TD
A[开始] --> B[获取支付参数]
B --> C[生成签名]
C --> D[发起支付请求]
D --> E[验证签名]
E --> F{支付是否成功}
F --> G[处理支付结果]
G --> H[结束]
F --> I[支付失败,重新生成签名]
I --> C
甘特图
gantt
title Java 微信公众号支付签名失败解决方案
dateFormat YYYY-MM-DD
section 支付流程
获取支付参数 :a1, 2022-01-01, 1d
生成签名 :a2, after a1, 1d
发起支付请求 :a3, after a2, 1d
验证签名 :a4, after a3, 1d
处理支付结果 :a5, after a4, 1d
section 重新生成签名
支付失败,重新生成签名 :a6, after a5, 1d
解决方案
获取支付参数
获取支付参数是进行微信公众号支付的第一步。你需要从后端接口或数据库中获取以下参数:
- appId:公众号的唯一标识
- timeStamp:时间戳
- nonceStr:随机字符串
- package:统一下单接口返回的 prepay_id 参数值
- signType:签名类型,固定为 MD5
接下来,你可以使用以下代码获取支付参数:
String appId = "your_app_id";
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonceStr = UUID.randomUUID().toString().replace("-", "");
String prepayId = "your_prepay_id";
String signType = "MD5";
生成签名
生成签名是进行微信公众号支付的第二步。你需要将支付参数按照字典序排序后拼接成字符串,再加上商户密钥进行 MD5 加密。
以下是生成签名的代码示例:
String key = "your_merchant_key";
String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonceStr + "&package=" + package + "&signType=" + signType + "&timeStamp=" + timeStamp + "&key=" + key;
String sign = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
发起支付请求
发起支付请求是进行微信公众号支付的第三步。你需要将生成的签名和支付参数一起发送给微信支付的接口。
以下是发起支付请求的代码示例:
String requestXml = "<xml>\n" +
" <appid>" + appId + "</appid>\n" +
" <mch_id>" + mchId + "</mch_id>\n" +
" <nonce_str>" + nonceStr + "</nonce_str>\n" +
" <sign>" + sign + "</sign>\n" +
" <body><![CDATA[微信公众号支付]]></body>\n" +
" <out_trade_no>" + outTradeNo + "</out_trade_no>\n" +
" <total_fee>" + totalFee + "</total_fee>\n" +
" <spbill_create_ip>" + spbillCreateIp + "</spbill_create_ip>\n" +
" <notify_url>" + notifyUrl + "</notify_url>\n" +
" <trade_type>JSAPI</trade_type>\n" +
" <openid>" + openid + "</openid>\n" +
"</xml>";
String responseXml = HttpClientUtils.postXml(payUrl, requestXml);
验证签名
验证签名是进行微信公众号支付的第四步。你需要从微信支付返回的结果中获取签名,并将支付参数按照生成签名时的规则重新生成签名。然后,将重新生成的签名与返回结果中的签名进行比对。
以下是验证签名的代码示例:
String responseSign = ... ; // 从返回结果中获取签名
String responseString
标签:java,String,--,微信,生成,签名,支付
From: https://blog.51cto.com/u_16213339/9052709