小程序支付与退款流程的详细解读

GS 222 2024-07-10

微信小程序的支付和退款流程

近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下。


首先说明一下,微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可。我在后端使用的是php,当然在这篇博客里我不打算贴一堆代码来说明支付的具体实现,而主要会侧重于整个支付的流程和一些细节方面的东西。所以使用其他后端语言的朋友有需要也是可以看一下的。很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑。好的,也不说什么废话了。进入正题。

一. 支付

支付主要分为几个步骤:

前端携带支付需要的数据(商品id,购买数量等)发起支付请求后端在接收到支付请求后,处理支付数据,然后携带处理后的数据请求 微信服务器 的 支付统一下单接口后端接收到上一步请求微信服务器的返回数据,再次处理,然后返回前端让前端可以开始支付。前端进行支付动作前端支付完成后,微信服务器会向后端发送支付通知(也就是微信要告诉你客户已经付过钱了),后端根据这个通知确定支付完成,然后就去做支付完成后的相应动作,比如修改订单状态,添加交易日志啊等等。
图片.png

下面就详细的说明一下各个步骤的具体实现

  1. 前端请求支付

    图片.png

2. 前端请求支付

图片.png

微信规定的请求数据:
这需要较多代码实现。因为需要的数据个数较多,而且还需要加密并以 XML 格式发送。
首先,有以下数据是使用小程序支付必须提供给微信服务器的参数。

小程序 appid。写小程序的大概没有不知道这个的。。。

用户标识 openid。也就是用户的小程序标识,在我上篇博客中说明了如何获取。

商户号 mch_id 。申请开通微信支付商户认证成功后微信发给你的邮件里有

商户订单号 out_trade_no 。商户为这次支付生成的订单号

总金额 total_fee 。订单总金额,很重要的一点是单位是分,要特别注意。

微信服务器回调通知接口地址 notify_url。微信确认钱已经到账后,会往这个地址多次发送消息,告诉你顾客已经付完钱了,

你需要返回消息给微信表示你已经收到了通知。。这个地址不能有端口号,同时要能直接接受POST方法请求。

交易类型 trade_type 。微信小程序支付此值统一为 JSAPI

商品信息 Body。类似"腾讯-游戏"这种格式

终端IP地址 spbill_create_ip 。终端地址IP,也就是请求支付的 IP 地址。

随机字符串 nonce_str 。需要后端随机生成的字符串用于保证数据安全。微信要求不长于32位。

签名 sign 。使用上面的所有参数进行相应处理加密生成签名。(具体处理方式可见下文代码,可直接复用。)

在处理好以上所有数据后,将这些数据以 XML 格式整理并以 POST 方法发送到 微信支付统一下单接口 https://api.mch.weixin.qq.com/pay/unifiedorder 。

3.后端接受微信服务器返回数据

微信服务器在接收到支付数据之后,如果数据没有问题,其会返回用于支付的相应数据,其中非常重要的是 名称为 prepay_id 的数据字段,需要将此数据返回前端,前端才能继续支付。

因此,在后端接收到微信服务器的返回数据后,需要进行相应的处理,最终返回到前端如下数据:

  1. appid 不需多说

  2. timeStamp 当前时间戳

  3. nonceStr   随机字符串

  4. package    就是上面提到的 prepay_id,不过切记格式如 “prepay_id= prepay_id_item“。否则会导致错误。

  5. signType  加密方式,一般应该是 MD5

  6. paySign   对以上数据进行相应处理并加密。

到这里,后端的支付接口已经完成了接收前端支付请求,并返回了前端支付所需数据的功能。

4. 前端发起支付

前端在接收到返回数据后,使用 wx.requestPayment() 来请求发起支付。此 API 需要的对象参数各项值就是我们上一步返回的各个数据。

5.后端接受微信服务器回调

前端完成支付后,微信服务器确认支付已经完成。就会向第一步中设置的回调地址发送通知。后端的接收回调接口在接收到通知后,就可以判断支付是否完成,从而决定后续动作。

需要注意的是,在接收到微信服务器的回调通知后,根据通知的result_code字段判断支付是否成功。在接受到成功的通知后,后端需要返回success数据向微信服务器告知已得到回调通知。否则微信服务器会不停的向后端发送消息。另外微信的通知是以XML格式发送的,在接受处理时需要注意。

微信的大概支付流程就是这样。以下是PHP语法的微信支付类,可以比照上面的步骤介绍,加深理解。在需要支付时,直接传入参数实例化此类再调用类的 pay 方法即可。

图片.png

图片.png

图片.png

图片.png

二. 商户发起退款请求

图片.png

退款请求需要的参数如下(多个参数在支付API请求时也有使用):

  1. 小程序 appid。

  2. 商户号 mch_id 。申请开通微信支付商户认证成功后微信发给你的邮件里有

  3. 商户订单号 out_trade_no 。退款订单在支付时生成的订单号

  4. 退款订单号 out_refund_no 。由后端生成的退款单号,需要保证唯一,因为多个同样的退款单号只会退款一次。

  5. 总金额 total_fee 。订单总金额,单位为分。

  6. 退款金额 refund_fee 需要退款的金额,单位同样为分

  7. 操作员 op_user_id .与商户号相同即可

  8. 随机字符串 nonce_str 。同支付请求

  9. 签名 sign 。使用上面的所有参数进行相应处理加密生成签名。(具体处理方式与支付相同,可直接复用。)

三. 退款完成

图片.png

退款因为流程与支付大同小异,因此退款的PHP类我选择了直接继承支付类,
代码如下,注意区分退款请求方法postXmlSSLCurl和支付请求方法postXmlCurl的区别,这也就是上文提到的退款需要的双向证书的使用。

图片.png

图片.png

以上就是小程序支付与退款流程的详细解读的详细内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序中购物车功能的实现方式探讨
下一篇:微信开发者工具中 appid 的获取方法全解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~