JSAPI调起支付:(需要的参数)
问题:这么实现它?
微信支付签名值paySign计算方法
1. 完整的代码展示:
// 需要的全部请求参数
String prepayId = resultMap.get("prepay_id");//下单返回的prepayId
long timestamp = System.currentTimeMillis();//时间戳
String nonceStr = WXPayUtil.generateNonceStr();//随机字符串
String pack = StringUtils.join("prepay_id=", prepayId);//订单详情扩展字符串
String paySign = getSign(wxPayConfig.getAppid(), timestamp, nonceStr, pack);//签名
logger.info("paySignpaySignpaySign="+paySign);
JSONObject data = new JSONObject();
data.put("appid",wxPayConfig.getAppid());//appid
data.put("timeStamp",String.valueOf(timestamp));
data.put("nonceStr",nonceStr);
data.put("package",pack);
data.put("signType","RSA");//签名方式
data.put("paySign",paySign);
return data;
2. 问题:签名参数是怎么实现的(是通过公共方法来实现的)
/**
* 作用:使用字段appId、timeStamp、nonceStr、package计算得出的签名值
* 场景:根据微信统一下单接口返回的 prepay_id 生成调启支付所需的签名值
* @param appId
* @param timestamp
* @param nonceStr
* @param pack package
* @return
* @throws Exception
*/
public String getSign(String appId, long timestamp, String nonceStr, String pack) throws Exception{
String message = buildMessage(appId, timestamp, nonceStr, pack);
String paySign= sign(message.getBytes("utf-8"));
return paySign;
}
private String buildMessage(String appId, long timestamp, String nonceStr, String pack) {
return appId + "\n"
+ timestamp + "\n"
+ nonceStr + "\n"
+ pack + "\n";
}
private String sign(byte[] message) throws Exception{
Signature sign = Signature.getInstance("SHA256withRSA");
//这里需要一个PrivateKey类型的参数,就是商户的私钥。
//获取商户私钥
PrivateKey privateKey = wxPayConfig.getPrivateKey(wxPayConfig.getPrivateKeyPath());
sign.initSign(privateKey);
sign.update(message);
return Base64.getEncoder().encodeToString(sign.sign());
}
3. 前端的写法:
/**
* @description: 通过JSAPI下单API成功获取预支付交易会话标识(prepay_id)后,需要通过JSAPI调起支付API来调起微信支付收银台
* 注1:WeixinJSBridge内置对象在其他浏览器中无效
* 注2:此API需要将请求参数进行签名(参与签名的参数为:appId、timeStamp、nonceStr、package,参数区分大小写)
* @param {*}
* @return {*}
*/
function onBridgeReady (res: any)
{
/* eslint-disable-next-line */
WeixinJSBridge.invoke('getBrandWCPayRequest', {
// 公众号ID,由商户传入
'appId': res.appId,
// 时间戳(转为String类型,兼容IOS “未传timeStamp”问题)
'timeStamp': String(res.timeStamp),
// 随机串
'nonceStr': res.nonceStr,
// 预支付交易会话标识
'package': `prepay_id=${res.prepayId}`,
// 微信签名方式
'signType': res.signType,
// 微信签名
'paySign': res.paySign
},
function (result: any)
{
// 微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
// 支付成功
if (result.err_msg === 'get_brand_wcpay_request:ok')
{
console.log('支付成功');
}
// 支付取消
if (result.err_msg === 'get_brand_wcpay_request:cancel')
{
console.log('支付取消');
}
// 支付失败
if (result.err_msg === 'get_brand_wcpay_request:fail')
{
console.log('支付失败');
}
});
}
/**
* @description: 调起微信JSAPI支付
* @param {*}
* @return {*}
*/
function bootWechatJSAPIPay (res: any)
{
let document: any;
if (typeof WeixinJSBridge === 'undefined')
{
if (document.addEventListener)
{
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}
else if (document.attachEvent)
{
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}
else
{
onBridgeReady(res);
}
}
// 调起微信JSAPI支付
bootWechatJSAPIPay(orderRes);