时间:2023-05-21 10:34:01 | 来源:网站运营
时间:2023-05-21 10:34:01 来源:网站运营
微信支付——后台对接:最近在做支付平台的项目,承接公司业务系统与第三方支付平台的对接任务,主要涉及微信支付、支付宝支付以及理房通支付等第三方平台。微信支付作为后起之秀,市场占有率大有赶超支付宝之势,其复杂多样的社交属性使支付场景丰富而深入。以下主要以业务后台对接的视角,对微信开发文档做了些总结,过滤出我们需要关注的点。(前端及App端对接请查官方资料)
商户号:微信支付分配的商户号。支付审核通过后,申请人邮箱会收到腾讯下发的开户邮件, 邮件中包含商户平台的账号、密码等重要信息。
appid:商户通过微信管理后台,申请服务号、订阅号、小程序或APP应用成功之后,微信会为每个应用分配一个唯一标识id。
openid:用户在公众号内的身份标识,一旦确认,不会再变;同一用户在不同公众号拥有不同的openid。商户后台系统通过登录授权、支付通知、查询订单等API可获取到用户的openid。主要用途是判断同一个用户,对用户发送客服消息、模版消息等。
微信管理后台:微信有很多管理平台,容易混淆,我们主要关注下面三个平台:
1. 微信公众平台 微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。帐号分类:服务号、订阅号、小程序、企业微信(也叫企业号,类似于企业OA)。
2. 微信商户平台 微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能。
3. 微信开放平台 商户APP接入微信支付开放接口的申请入口,通过此平台可申请微信APP支付。
签名:商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法 由微信支付制定并公开,常用的签名方式有:MD5、SHA1、SHA256、HMAC等。
密钥:作为签名算法中的盐,需要在微信平台及商户业务系统各存一份,要妥善保管。key设置路径:微信商户平台(http://pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置。
一个完整的支付流程如下:用户在业务系统下完单,进入收银台页面;选择微信支付,业务后台将业务单信息传给微信后台,完成预下单;拿到预下单结果后,收银台唤起微信交互页面,用户输密码确认支付;微信后台完成支付逻辑,并通知业务后台,完成业务端逻辑。目前微信支持多种支付场景,重点关注扫码支付与公众号支付。1. 刷卡支付 申请流程
用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。大家比较感兴趣的是,收银员扫了一下我们的微信条形码,卡上的钱是怎么被扣掉的呢?免密支付流程
商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。按二维码的含义分为两个模式。(二维码知识)
又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。4. 公众号支付 申请流程
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。6. 小程序支付
申请流程:使用注册微信支付时登记的邮箱,将公司名称+商户号+联系方式 以及对应H5支付应用场景说明发送到 wxpaySP@tencent.com
用户在微信小程序中使用微信支付的场景,接口对接时与公众号支付很相似。
微信支付开发文档上将接口分为普通商户版和服务商版。所谓普通商户,是指有实际业务需求,要对接微信支付的广大商户;而服务商,是指那些有开发能力的第三方服务提供商,它们封装微信支付高级接口,为普通商户提供支付申请、技术开发、机具调试、活动营销等全生态链服务支持,以简化对接流程。因此,普通商户对接微信支付平台有两个选择:直接对接微信平台 或 对接服务商平台。2. 接口文档
<xml> <appid>wx2421b1c4370ec43b</appid> <body>JSAPI支付测试</body> <mch_id>10000100</mch_id> <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url> <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid> <out_trade_no>1415659990</out_trade_no> <spbill_create_ip>14.23.150.211</spbill_create_ip> <total_fee>1</total_fee> <trade_type>JSAPI</trade_type> <sign>0CB01533B8C1EF103065174F50BCA001</sign></xml>
获取openid公众号支付模式下,统一下单接口必须要传用户的openid,业务后台获取openid的步骤如下:
返回结果有两个状态码return_code及result_code,需要理解其各自的含义。return_code表示通信是否成功,当其为SUCCESS时,才会有后续的返回字段,当其为FAIL时,return_msg会填充错误信息;而result_code表示业务操作是否成功,当其为SUCCESS时,才会返回后续的业务字段(如prepay_id等),当其为FAIL时,会填充err_code及err_code_des等字段。返参试例
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[JSAPI]]></trade_type></xml>
2.2.2 支付结果通知支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功(因此商户端需要定时去check两边待支付单子的状态)。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)。接口链接
回调通知接口对安全性要求极高,有如下注意点:
1. 接口幂等,同样的通知可能会多次发送给商户系统。商户系统必须保证回调接口是幂等的,能够正确处理重复的通知。
2. 并发控制,在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
3. 签名验证,商户系统对于支付结果通知的内容一定要做签名验证。
4. 金额校验,校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
该链接由商户端提供,通过【统一下单API】中提交的参数notify_url设置,通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”入参信息
入参信息是由微信平台整理发送的,商户后端需要接收并解析各字段,做必要的校验。入参例子
<xml> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <bank_type><![CDATA[CFT]]></bank_type> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str> <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid> <out_trade_no><![CDATA[1409811653]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign> <time_end><![CDATA[20140903131540]]></time_end> <total_fee>1</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id></xml>
返回参数商户后台的返回参数必须是微信支付指定的格式,否则都被微信认为通知失败,会不断重试。返参例子
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>
2.2.3 申请退款 /secapi/pay/refund退款有两种方式,商户可以登录微信商户平台,直接使用管理后台的退款功能;另一种则是接口对接,在商户的业务系统里发起退款。 退款时需要注意的是:入参信息
1. 交易时间超过一年的订单无法提交退款;
2. 微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。
3. 每个支付订单的部分退款次数不能超过50次。
<xml> <appid>wx2421b1c4370ec43b</appid> <mch_id>10000100</mch_id> <nonce_str>6cefdb308e1e2e8aabd48cf79e546a02</nonce_str> <out_refund_no>1415701182</out_refund_no> <out_trade_no>1415757673</out_trade_no> <refund_fee>1</refund_fee> <total_fee>1</total_fee> <transaction_id></transaction_id> <sign>FE56DD4AA85C0EECA82C35595A69E153</sign></xml>
返回参数这里需要注意返回参数里return_code为SUCCESS且result_code也为SUCCESS时,只是说明退款申请成功了,并不代表钱已经成功退给用户。因此,业务端需要通过退款查询接口定时check退款单的状态,如果有异常需要报警出来,以便人工处理。退款状态
关键词:后台,支付