悠悠楠杉
正确调用微信JSAPI支付:别忘了total_fee
正确调用微信JSAPI支付:别忘了total_fee
参数
在移动互联网应用中,集成支付功能是提升用户体验和实现商业变现的重要一环。微信支付的JSAPI(JavaScript API)因其便捷性和安全性,成为了众多开发者的首选。然而,在开发过程中,常常因为疏忽或误解导致支付调用时遗漏了total_fee
参数,从而引发一系列问题。本文将详细介绍如何正确调用微信JSAPI支付,并特别强调total_fee
参数的重要性。
1. 准备工作
在开始之前,请确保你已经注册了微信公众账号并获取了以下必要的API密钥和配置信息:
- appId
(应用ID)
- mchId
(商户号)
- key
(API密钥)
- nonceStr
(随机字符串)
- timestamp
(时间戳)
- package
(包含商品信息的字符串)
- signType
(签名方式)
2. 了解total_fee
的重要性
total_fee
是支付金额的单位为分(如100元应传为10000)。它是发起支付请求时必不可少的一个参数,用于明确告知用户将要支付的金额。如果遗漏此参数或参数值错误,将导致支付请求无法正常处理,甚至引发安全警告。
3. 正确调用JSAPI支付的步骤
3.1 生成预支付交易单
首先,你需要通过后端服务器生成预支付交易单,并获取到prepay_id
。这一步通常涉及以下步骤:
- 组装包含商品信息的XML数据包。
- 通过HTTPS请求微信的统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)。
- 解析返回的XML数据,提取prepay_id
。
3.2 组装JSAPI支付参数
获得prepay_id
后,按照微信的JSAPI支付要求组装所需参数:
- appId
:你的应用ID。
- timestamp
:当前时间戳。
- nonceStr
:随机字符串。
- package
:格式为prepay_id=xxx
的字符串。
- signType
:签名类型,通常为MD5
。
- total_fee
:商品总金额,单位为分。
- 生成签名(根据API密钥、appId、nonceStr、timestamp、package进行MD5加密)。
3.3 客户端调用JSAPI发起支付请求
在前端JavaScript中,使用微信JS-SDK的调用函数来发起支付请求:
javascript
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
appId: appId, // 公众号名称,由商户传入
timestamp: timestamp, // 时间戳,自1970年1月1日(08:00:00 GMT)至标示的日期时间的总毫秒数。注意:这里的时间戳是服务器的当地时间戳。非北京时间或深圳时间戳。建议使用服务器时间戳与服务器端同步时间。格式如:2014122715582548678825437246789899999998982543212345678989998998982543212345678989999998,注意要使用字符串形式(String),不要使用Number类型或其它形式。服务器端返回的格式为Number类型时需要转换格式为String类型再进行传输。请特别注意此点!, (例子中的格式为乱码示例,实际使用时请用正确的数字替换),
nonceStr: nonceStr, // 随机串,不长于32位。用于防止重放攻击(例如:3a2b4c5d6e7f),推荐随机数生成算法, (不填此字段代表使用默认值),(示例中的格式为乱码示例),
package: packageString, // 预支付交易会话标识的是prepay_id, (不填此字段代表使用默认值),(示例中的格式为乱码示例),
signType: 'MD5', // 签名方式,默认为'MD5',使用新版支付时必须指定为'MD5-Hex',目前默认是MD5, (不填此字段代表使用默认值),(注:MD5-Hex不是MD5加密算法,是指MD5加密后以16进制字符串形式展现) ,(示例中的格式为乱码示例),这里注意是大小写敏感的!!!, (注意点号后面还有注释内容!),(不填此字段代表使用默认值),(注:在调用getBrandWCPayRequest接口之前必须先登录jsapi_pay_v3获得access_token), (不填此字段代表使用默认值), (示例中的格式为乱码示例),// 注意:返回的状态码不一定是0(非测试号没有成功权限时会返回其他值), 此处只判断返回的状态码是否为成功状态码!!,!!,!!,!!!, (不填此字段代表使用默认值)!,!!,! // {err_msg} // {ret_code} // 错误代码说明等 // {ret_msg} // 错误代码说明等! }, function(res){ console.log(res.err_msg); });
4. 注意事项与常见问题解决
- 确保时间戳和随机字符串的同步与正确性:这关系到签名的正确生成和防止重放攻击。
- 签名算法的正确实现:按照微信的规则进行MD5或HMAC-SHA256等加密操作。
- 测试与调试:在开发阶段应多进行测试,并检查文档中的最新更新和变更。
- 错误处理:对于前端来说,良好的错误处理能极大提升用户体验和问题定位效率。如通过console.log输出详细的错误信息等。