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);

Copyright © 2088 年度精选网游活动网 All Rights Reserved.
友情链接