随着微信小程序的发展,越来越多的移动应用选择微信产品作为媒介。无论是公众号开发还是小程序开发,微信支付永远是绕不开的话题。由于微信支付涉及的场景较多,本文只学习在公众号和小程序中接入微信支付。一、微信支付的前提条件1.1公众号微信公众号大致分为服务号和订阅号。订阅号和服务号的具体区别在SpringBoot开发微信之前写的一篇文章公众号有详细介绍,这里不再赘述。通常,服务帐户提供更高级的功能。微信支付接入需要完成微信认证的服务号。如果是小程序,还需要完成微信认证。公众号可以关联10个相同主题的小程序和3个不同主题的小程序。如果是和公众号同主题的小程序,并且公众号已经完成认证,可以直接在公众号的后台链接到小程序在小程序管理中,快速注册认证完成后,无需重复支付微信认证所需的300元。1.2微信商户平台微信认证完成后,在公众号后台微信支付中开通微信支付功能。提交微信支付申请后,将在3-5个工作日内审核。审核通过后,会向您填写的邮箱发送一封包含商户号信息的邮件,几分钟后会发送至您同时填写的公众号。零钱汇款需要到商户平台查看具体金额并进行验证。商户分为普通商户和服务商商户。不要在申请时犯错误。普通商户可以进行交易,但不能拓展商户。服务商可以拓展商户,但不能交易。服务商是提供一个统一的支付入口,需要绑定特定的通用商户。微信支付时,会在支付界面携带通用商户参数。支付成功后,金额将直接转入指定的通用商户账户。申请时,可直接为普通商户申请。1.3绑定商户微信支付的发起依赖于公众号、小程序和商户账号等应用之间的绑定关系。因此,商家在开发前需要绑定具体的应用。如果商户与待绑定的AppID为同一主体,则只需执行以下步骤即可完成绑定。在商户平台-产品中心-AppID账户管理中关联AppID,在公众号或小程序后台-微信支付-商户账户管理中输入AppId申请绑定并确认。如果商户和要绑定的AppID是不同的主体,步骤同上,除了填写AppId外,还需要填写AppId的认证信息。2、微信支付相关配置2.1支付产品类型1、支付码支付用户打开微信钱包-支付码接口,商户扫码提交完成支付。2、JSAPI支付用户微信扫码、关注公众号等进入商户H5页面,微信调用JSSDK完成支付。3、原生支付用户打开微信扫一扫,扫描商户二维码完成支付。4、微信SDK集成在商户APP中进行APP支付,用户点击跳转到微信完成支付。5、H5支付用户在微信以外的手机浏览器请求微信支付的场景调用微信支付。6、小程序支付用户在微信小程序中使用微信支付的场景。7、刷脸支付无需拿出手机,刷脸即可完成支付,适用于各种线下场景。在商户平台-产品中心-我的产品中申请激活支付产品。2.2支付授权目录配置在商户平台-产品中心-开发配置中配置支付授权目录(即您开发的订单接口地址)。需要注意的是授权目录最多可以配置五个。请在开发过程中保持理性。定义支付接口。2.3配置商户密钥在商户平台-账户中心-API安全中设置API密钥。首次设置时需要安装操作证书,傻瓜式安装,按照提示一步步操作即可。APIkey需要一个32位的随机字符串,切记不要随意更改APIkey。在微信APIv3版本中,除了配置APIkey外,还需要配置APIv3key,并申请CA颁发的API证书。APIv3密钥主要用于平台证书解密和回调信息解密。API证书用于调用更高层的API接口,包括退款、红包等接口。如果您使用开源的微信开发包,请检查是否支持v3版本。2.4配置服务器启用并在公众号后台-开发-基础配置-服务器配置中填写服务器信息。2.5白名单配置在公众号后台-开发-基础配置-公众号开发信息中配置developerkey,同时填写IP白名单。2.6JS接口安全域名在公众号后台-公众号设置-功能设置中设置JS接口安全域名。以上配置基于公众号支付配置。小程序支付就没那么麻烦了。小程序支付不需要配置支付授权目录和授权域名。3、微信支付流程由于微信升级了API接口,在APIv3接口中,需要加载API证书申请。微信已经打包了相关的jar包,并提供了加载示例。详情请参考“https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_3.shtml”,这里不再赘述。下面以APIv2为例详细研究一下微信接入的主要流程(因为APIv3的部分接口还在升级中,v2的接口比较完善)。上图来自微信开发文档,我们来详细分析一下支付流程。3.1微信下单接口用户通过微信客户端发起支付,在商户后台生成订单,然后调用微信下单接口生成预付订单并返回订单号!order接口涉及的主要参数,只列出几个重要的参数:sign的签名也比较笼统,涉及到一个nonce_str来保证签名的不可预测性。所有发送的非空参数,按字典排序,生成键值对(key1=value1&key2=value2);在上述字符串末尾拼接商户平台密钥("String"+&key=key);将上述字符串用MD5加密3.2支付拉起微信支付,输入密码,完成支付。这一步需要在H5网页中执行JS调用支付。以下参数是必填项,所以预付费订单返回时,需要将以下参数打包响应给页面,页面完成支付。签名方法与订单接口相同。JS伪代码如下:functiononBridgeReady(){WeixinJSBridge.invoke('getBrandWCPayRequest',{//公众号ID,商家传入的"appId":"wx2421b1c4370ec43b",//时间戳,秒数1970"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,但不保证万无一失。}});}if(typeofWeixinJSBridge=="undefined"){if(document.addEventListener){document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false);}elseif(document.attachEvent){document.attachEvent('WeixinJSBridgeReady',onBridgeReady);document.attachEvent('onWeixinJSBridgeReady',onBridgeReady);}}else{onBridgeReady();}注意伪代码中这句话//res.err_msg会在用户支付成功后返回ok,但是有不保证绝对可靠。为什么这么说,我应该举个例子来理解。去超市买东西,是不是说付款成功后就可以带走?肯定不是,商家收到钱才算你付款成功,你就可以把东西拿走了。也就是说,这里提示的成功并不一定代表支付成功。微信平台会以异步方式通知您支付成功与否。3.3异步通知异步通知是很重要的一步,你可以根据通知的结果处理你的业务逻辑。但由于网络波动等原因,可能无法收到通知,或微信收到的响应不符合API要求,微信会持续发起多次通知(请在回调通知接口合理处理,避免重复通知导致业务重复处理。),直到成功,通知频率总共为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h-24h4m).但微信不保证最终通知成功。异步通知响应参数如下:微信一直通知成功怎么办?还是刚才的例子,你明明付款成功了,但是商家一直说她没有收到钱,这时候怎么办?肯定是要看看她的手机有没有收到钱!同样在这里。3.4支付状态查询商户APP或前端页面收到支付返回后,商户需要调用商户订单查询接口确认订单状态,并将查询结果展示给用户。商户后台需要准确高效地处理微信支付发送的异步支付结果通知,并按照接口规范将处理结果返回给微信支付。当商户后台收不到异步支付结果通知时,商户应主动调用微信支付订单查看接口同步订单状态。商户在T+1日从微信支付端获取T日的交易账单,与商户系统中的订单进行核对。如果在微信支付端下单成功,但在商家端没有下单,则商家需要给用户补发货或退款。4.总结本文主要以公众号支付为例,总结接入微信支付所需的相关配置和支付流程。其他支付比如APP支付也是开发中比较常见的应用场景。APP支付需要在微信开放平台创建应用接入微信支付。另外,微信支付API正在顺利升级到v3,部分接口暂未升级。与v2相比,升级后的接口在数据格式上发生了一些变化。如果引用第三方开发包进行开发,需要注意接口对应的版本。
