全面指南:如何在微信公众号和小程序中无缝接入微信支付体系,提升用户体验与满意度
随着微信小程序的迅猛发展,越来越多的移动应用选择利用微信平台进行数字支付。无论是微信公众号开发还是小程序构建,微信支付始终是一个不可回避的重要话题。微信支付适用于多种场景,本文将专注于如何在微信公众号和小程序中接入微信支付。
一、接入微信支付的前提条件
1.1 微信公众号要求
接入微信支付所需的条件是已完成微信认证的服务号。如果您是小程序,也同样需要完成微信认证。公众号可以关联至多10个同一主体的小程序,而对于不同主体的公众号,可以关联3个小程序。如果与公众号同一主体的小程序已完成认证,您可以直接在公众号后台的小程序管理
中快速注册并认证,这样就不必再次支付300元人民币的微信认证费用。
1.2 微信商户平台
完成微信认证后,您需要在公众号后台的微信支付
中启动微信支付功能。提交申请后,审核将于3至5个工作日内完成。审核通过后,您会收到一封包含商户号信息的邮件,另外还会向您指定的对公账户汇款几毛钱,您需要根据具体金额来验证。
商户分为普通商户与服务商商户,请确保申请正确。普通商户可进行交易,但无法拓展其他商户;服务商则可以拓展商户,但无法进行交易。服务商提供统一的支付入口,需要绑定具体的普通商户,交易成功后金额会直接转入相应的普通商户账户。
申请普通商户即可。
1.3 商户绑定
微信支付的发起依赖于应用与商户号之间的绑定关系。因此,在开发之前,您需要将商户与具体应用进行绑定。如果商户与待绑定的AppID是同一主体,只需执行以下步骤:
- 在商户平台的产品中心中,管理AppID,输入AppID申请绑定。
- 在公众号或小程序后台的微信支付中确认商户号管理。
如果商户与待绑定的AppID属于不同主体,则步骤相同,除了输入AppID外,还需提供AppID的认证信息。
二、微信支付的相关配置
2.1 支付产品类型
- 付款码支付:用户在微信钱包中打开付款码界面,商户扫码后用户完成支付。
- JSAPI支付:用户通过微信扫码或关注公众号等方式进入商家H5页面,并在微信内通过JSSDK完成支付。
- Native支付:用户使用微信扫一扫,扫描商户二维码完成支付。
- APP支付:商户APP中集成微信SDK,用户点击后跳转至微信完成支付。
- H5支付:用户在非微信手机浏览器中请求微信支付,唤起微信支付。
- 小程序支付:用户在微信小程序中使用微信支付。
- 刷脸支付:用户无需掏出手机,通过面部识别完成支付,特别适合线下场景。
在商户平台的产品中心中,您可以申请开通适合的支付产品。
2.2 支付授权目录配置
在商户平台的产品中心中,进入开发配置,配置支付授权目录(即您开发的下单接口地址)。请注意,授权目录最多可配置五个,在开发过程中合理定义支付接口。
2.3 配置商户密钥
在商户平台的账户中心中,设置API密钥。
初次设置时,您需要安装操作证书,按照提示一步一步进行即可。API密钥需为32位的随机字符串,切勿随意更改。
在微信API v3版本中,除了配置API密钥外,还需设置APIv3密钥和申请CA颁发的API证书。API v3密钥主要用于平台证书解密及回调信息解密,而API证书则用于调用更高级的API接口,包括退款和红包等功能。
请确保您使用的开源微信开发包支持v3版本。
2.4 配置服务器
在公众号后台的开发基础配置中,启用并填写服务器信息。
2.5 白名单配置
在公众号后台的开发基础配置中,配置开发者密钥并填写IP白名单。
2.6 JS接口安全域名
在公众号设置功能中,设置JS接口安全域名。
以上配置主要适用于公众号支付,而小程序支付则相对简便,无需配置支付授权目录和授权域名。
JSAPI | 小程序 | |
---|---|---|
支付协议 | HTTP/HTTPS | HTTPS |
支付目录 | 有 | 无 |
授权域名 | 有 | 无 |
三、微信支付的流程
由于微信对API接口进行了升级,在API v3中需要加载申请的API证书,相关的jar包及加载示例已由微信封装,具体可参考“https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_3.shtml”。本部分将以API v2为例详细介绍接入过程,因为API v3的一些接口仍在持续升级,v2接口相对完整。
以上图片来自微信开发文档,我们将详细分析支付流程。
3.1 微信下单接口
用户通过微信客户端发起支付,商户后台生成订单后调用微信下单接口,生成预支付订单并返回订单号。
下单接口涉及的主要参数包括:
请求参数 | 是否必传 | 类型 | 描述 |
---|---|---|---|
appid | 是 | String | 公众号appid |
mch_id | 是 | String | 商户号 |
nonce_str | 是 | String | 随机字符串,32位以内 |
sign | 是 | String | 签名,默认使用MD5加密 |
out_trade_no | 是 | String | 系统内部订单号 |
total_fee | 是 | Int | 订单总金额,单位为分 |
notify_url | 是 | String | 支付结果通知接口 |
签名的生成过程也相对通用,需要确保签名不可预测:
- 将所有非空参数按字典顺序排序生成键值对(key1=value1&key2=value2);
- 将商户平台密钥拼接在该字符串的最后("String"&key=密钥);
- 将上述字符串使用MD5加密。
3.2 支付
拉起微信支付,用户输入密码完成支付。这一步骤需要在H5网页中执行JS调用支付。
返回的预支付订单需要封装以下参数并响应给页面,以便用户完成支付。
参数名 | 是否必传 | 类型 | 描述 |
---|---|---|---|
appId | 是 | String | 公众号id |
timeStamp | 是 | String | 当前时间戳 |
nonceStr | 是 | String | 随机字符串 |
package | 是 | String | 预支付订单,格式为prepay_id=*** |
signType | 是 | String | 签名类型,默认为MD5 |
paySign | 是 | String | 签名 |
签名生成方式与下单接口一致。
JS伪代码示例如下:
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b",
"timeStamp":"1395712654",
"nonceStr":"e61463f8efa94090b1f366cccfbbb444",
"package":"prepay_id=u802345jgfjsdfgsdg888",
"signType":"MD5",
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89"
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 微信团队提示:res.err_msg将在用户支付成功后返回ok,但并不保证其绝对可靠。
}
});
}
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.err_msg将在用户支付成功后返回ok,但并不保证其绝对可靠。
的原因很简单:用户需要实际确保商家收到钱,支付成功不仅仅是依赖表面上的结果,微信平台会以异步通知的方式告知最终结果。
3.3 异步通知
异步通知是一个关键步骤,允许您根据通知结果处理业务逻辑。但由于网络波动等原因,通知可能会失败,微信会持续尝试多次通知(请在回调通知接口中合理处理,避免重复通知造成业务重复处理),通知频率为15s
/15s
/30s
/3m
/10m
/20m
/30m
/30m
/30m
/60m
/3h
/3h
/3h
/6h
/6h
。
异步通知的响应参数如下:
参数名 | 是否必传 | 类型 | 描述 |
---|---|---|---|
return_code | 是 | String | 返回状态码,SUCCESS /FAIL |
return_msg | 否 | String | 返回信息 |
如果微信的通知始终失败,您需要主动检查自己的系统,确认是否支付成功。
3.4 支付状态查询
- 商户APP或前端页面收到支付返回时,需要调用商户查单接口确认订单状态,并将查询结果展示给用户。
- 商户后台需准确处理微信支付发送的异步结果通知,并根据接口规范将处理结果返回给微信支付。
- 若商户未收到异步支付结果通知,应主动调用
微信支付查单接口
,同步订单状态。 - 商户在T+1日从微信支付侧获取T日的交易账单,并与商户系统中的订单进行核对。如发现订单在微信支付侧已成功但在商户侧未成功,商户需及时为用户补发货物或进行退款处理。