随着微信小程序的迅猛发展,越来越多的移动应用选择利用微信平台进行数字支付。无论是微信公众号开发还是小程序构建,微信支付始终是一个不可回避的重要话题。微信支付适用于多种场景,本文将专注于如何在微信公众号和小程序中接入微信支付。

一、接入微信支付的前提条件

1.1 微信公众号要求

接入微信支付所需的条件是已完成微信认证的服务号。如果您是小程序,也同样需要完成微信认证。公众号可以关联至多10个同一主体的小程序,而对于不同主体的公众号,可以关联3个小程序。如果与公众号同一主体的小程序已完成认证,您可以直接在公众号后台的小程序管理中快速注册并认证,这样就不必再次支付300元人民币的微信认证费用。

图片

1.2 微信商户平台

完成微信认证后,您需要在公众号后台的微信支付中启动微信支付功能。提交申请后,审核将于3至5个工作日内完成。审核通过后,您会收到一封包含商户号信息的邮件,另外还会向您指定的对公账户汇款几毛钱,您需要根据具体金额来验证。

商户分为普通商户与服务商商户,请确保申请正确。普通商户可进行交易,但无法拓展其他商户;服务商则可以拓展商户,但无法进行交易。服务商提供统一的支付入口,需要绑定具体的普通商户,交易成功后金额会直接转入相应的普通商户账户。

图片申请普通商户即可。

1.3 商户绑定

微信支付的发起依赖于应用与商户号之间的绑定关系。因此,在开发之前,您需要将商户与具体应用进行绑定。如果商户与待绑定的AppID是同一主体,只需执行以下步骤:

  • 在商户平台的产品中心中,管理AppID,输入AppID申请绑定。
  • 在公众号或小程序后台的微信支付中确认商户号管理。

图片

如果商户与待绑定的AppID属于不同主体,则步骤相同,除了输入AppID外,还需提供AppID的认证信息。

图片

二、微信支付的相关配置

2.1 支付产品类型

  1. 付款码支付:用户在微信钱包中打开付款码界面,商户扫码后用户完成支付。
  2. JSAPI支付:用户通过微信扫码或关注公众号等方式进入商家H5页面,并在微信内通过JSSDK完成支付。
  3. Native支付:用户使用微信扫一扫,扫描商户二维码完成支付。
  4. APP支付:商户APP中集成微信SDK,用户点击后跳转至微信完成支付。
  5. H5支付:用户在非微信手机浏览器中请求微信支付,唤起微信支付。
  6. 小程序支付:用户在微信小程序中使用微信支付。
  7. 刷脸支付:用户无需掏出手机,通过面部识别完成支付,特别适合线下场景。

在商户平台的产品中心中,您可以申请开通适合的支付产品。

图片

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/HTTPSHTTPS
支付目录
授权域名

三、微信支付的流程

由于微信对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 微信下单接口

用户通过微信客户端发起支付,商户后台生成订单后调用微信下单接口,生成预支付订单并返回订单号。

下单接口涉及的主要参数包括:

请求参数是否必传类型描述
appidString公众号appid
mch_idString商户号
nonce_strString随机字符串,32位以内
signString签名,默认使用MD5加密
out_trade_noString系统内部订单号
total_feeInt订单总金额,单位为分
notify_urlString支付结果通知接口

签名的生成过程也相对通用,需要确保签名不可预测:

  • 将所有非空参数按字典顺序排序生成键值对(key1=value1&key2=value2);
  • 将商户平台密钥拼接在该字符串的最后("String"&key=密钥);
  • 将上述字符串使用MD5加密。

3.2 支付

拉起微信支付,用户输入密码完成支付。这一步骤需要在H5网页中执行JS调用支付。

返回的预支付订单需要封装以下参数并响应给页面,以便用户完成支付。

参数名是否必传类型描述
appIdString公众号id
timeStampString当前时间戳
nonceStrString随机字符串
packageString预支付订单,格式为prepay_id=***
signTypeString签名类型,默认为MD5
paySignString签名

签名生成方式与下单接口一致。

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_codeString返回状态码,SUCCESS/FAIL
return_msgString返回信息

如果微信的通知始终失败,您需要主动检查自己的系统,确认是否支付成功。

3.4 支付状态查询

  1. 商户APP或前端页面收到支付返回时,需要调用商户查单接口确认订单状态,并将查询结果展示给用户。
  2. 商户后台需准确处理微信支付发送的异步结果通知,并根据接口规范将处理结果返回给微信支付。
  3. 若商户未收到异步支付结果通知,应主动调用微信支付查单接口,同步订单状态。
  4. 商户在T+1日从微信支付侧获取T日的交易账单,并与商户系统中的订单进行核对。如发现订单在微信支付侧已成功但在商户侧未成功,商户需及时为用户补发货物或进行退款处理。