微信JSAPI支付详解
一、概述
微信JSAPI支付是指通过微信公众号或开放平台的网页授权获取用户openid,再通过JSAPI接口完成支付的一种移动支付方式。它主要适用于微信公众号开发、微信小程序开发等场景。 本文将从准备工作、支付流程和注意事项三个方面详细介绍微信JSAPI支付。
二、准备工作
在进行微信JSAPI支付时,需要完成以下准备工作:
- 开通微信支付功能,并完成商户认证;
- 获取微信支付相关API信息,包括appid、mchid、key等;
- 在微信公众平台或开放平台创建应用,并完成绑定,获取appid和appsecret;
- 在应用中完成OAuth2.0网页授权,获取用户openid。 完成以上准备工作后,即可进入微信JSAPI支付流程。
三、支付流程
微信JSAPI支付的流程主要包括以下步骤:
1. 获取用户授权
用户需先授权给商户公众号或开放平台,允许查询用户基本信息,包括openid。
<!-- 获取微信OAuth2.0授权 -->
var wxAuth = "https://open.weixin.qq.com/connect/oauth2/authorize?";
var appId = "appid=YOUR_APPID";
var redirectUri = "&redirect_uri=YOUR_REDIRECT_URI";
var responseType = "&response_type=code";
var scope = "&scope=snsapi_base";
var state = "&state=STATE#wechat_redirect";
var url = wxAuth + appId + redirectUri + responseType + scope + state;
window.location.href = url;
2. 生成预支付订单
商户后台调用微信统一下单接口,生成预支付订单,同时返回预支付交易会话标识prepay_id。
// 获取微信统一下单接口
var wxUnifiedOrder = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// 构造预支付订单参数
var data = {
appid: "YOUR_APPID", // 公众号appid
mch_id: "YOUR_MCHID", // 商户号
nonce_str: "RANDOM_STRING", // 随机字符串
body: "PRODUCT_NAME", // 商品描述
out_trade_no: "YOUR_ORDER_NUMBER", // 商户订单号
total_fee: "TOTAL_FEE", // 总金额(单位:分)
spbill_create_ip: "IP_ADDRESS", // 终端IP
notify_url: "YOUR_NOTIFY_URL", // 通知地址
trade_type: "JSAPI", // 交易类型
openid: "USER_OPENID" // 用户openid
};
// 对参数进行签名
data.sign = sign(data, "YOUR_KEY");
// 将参数转换为XML格式
var postData = convertToXml(data);
// 发送计算预支付订单请求
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// 解析支付接口返回的XML数据
var response = parseXml(xhr.responseText);
// 获取prepay_id
var prepayId = response.prepay_id;
}
}
xhr.open("POST", wxUnifiedOrder, true);
xhr.send(postData);
3. 生成支付参数
根据微信支付API规范,生成支付参数。
// 构造支付参数
var params = {
appId: "YOUR_APPID",
nonceStr: "RANDOM_STRING",
package: "prepay_id=" + prepayId,
signType: "MD5",
timeStamp: new Date().getTime()/1000|0
};
// 对参数进行签名
params.paySign = sign(params, "YOUR_KEY");
4. 调用微信支付接口
调用微信支付JSAPI接口进行支付。
// 调用微信支付JSAPI
WeixinJSBridge.invoke('getBrandWCPayRequest', params, function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 支付成功后的处理逻辑
} else {
// 支付失败后的处理逻辑
}
});
四、注意事项
在使用微信JSAPI支付时,需要注意以下几点:
- 请确保公众号或开放平台已完成认证,并正确获取相应API信息。
- 预支付订单的费用单位是分,需要注意转化。
- 生成支付参数时,请确保参数的完整性和正确性,并进行签名。
- 调用微信支付接口前需先判断WeixinJSBridge是否存在。
- 在本地测试时需使用HTTPS协议。
总结
本文详细介绍了微信JSAPI支付的流程和注意事项,希望对开发者能有所帮助。如有疑问或错误,欢迎指出。