微信小程序支付

【转载https://blog.csdn.net/rolan1993/article/details/78676282】

支付主要分为几个步骤

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

  前端:微信登陆获取code,然后将商品数据,code,价格等订单必要信息传入后台,传入成功后,从后台获取数据,发起支付

  后端:拿到code(微信服务器换取)openid,调用(微信服务器)统一下单接口得到prepay_id,再按签名规范重新生成签名,返回前台

tip:后端接收到前端发送的支付请求后,可以进行一下相关验证,例如判断一下用户有没有问题,支付金额对不对等等。 在验证没什么问题,可以向微信服务器申请支付之后,后端需要使用 微信规定的数据格式 去请求微信的支付统一下单接口。

-------------------------------------------------------------------------------------------------

统一下单(换取prepareId):以下数据是使用小程序支付必须提供给微信服务器的参数:

  1. 小程序 appid。写小程序的大概没有不知道这个的。。。
  2. 用户标识 openid。
  3. 商户号 mch_id 。申请开通微信支付商户认证成功后微信发给你的邮件里有
  4. 商户订单号 out_trade_no 。商户为这次支付生成的订单号
  5. 总金额 total_fee 。订单总金额,很重要的一点是单位是分,要特别注意。
  6. 微信服务器回调通知接口地址 notify_url。微信确认钱已经到账后,会往这个地址多次发送消息,告诉你顾客已经付完钱了,你需要返回消息给微信表示你已经收到了通知。。这个地址不能有端口号,同时要能直接接受POST方法请求。
  7. 交易类型 trade_type 。微信小程序支付此值统一为 JSAPI
  8. 商品信息 Body。类似"腾讯-游戏"这种格式
  9. 终端IP地址 spbill_create_ip 。终端地址IP,也就是请求支付的 IP 地址。
  10. 随机字符串 nonce_str 。需要后端随机生成的字符串用于保证数据安全。微信要求不长于32位。
  11. 签名 sign 。使用上面的所有参数进行相应处理加密生成签名。tip://将这些数据以 XML 格式整理并以 POST 方法发送到 微信支付统一下单接口 。

最终返回到前端如下数据:

  1. appid 不需多说
  2. timeStamp 当前时间戳
  3. nonceStr 随机字符串
  4. package 就是上面提到的 prepay_id,不过切记格式如 “prepay_id= prepay_id_item“。否则会导致错误。
  5. signType 加密方式,一般应该是 MD5
  6. paySign 对以上数据进行相应处理并加密。

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

一. 用户发起退款请求

  用户在前端发起退款请求,后端接收到退款请求,将相应订单标记为申请退款,展示在后台.商户查看后,如果同意退款再进行相应操作.此后才进入真正的退款流程

二. 商户发起退款请求

  商户同意退款后,后端即向微信提供的退款 API 发起请求.
    同请求微信支付API一样.退款请求也需要将需要的参数进行签名后以XML发送到微信的退款API [https://api.mch.weixin.qq.com/pay/refund](https://api.mch.weixin.qq.com/pay/refund)

退款请求需要的参数如下(多个参数在支付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 。使用上面的所有参数进行相应处理加密生成签名。(具体处理方式与支付相同,可直接复用。)

三. 退款完成

  在发起退款请求后,就可以直接根据请求的响应XML中的  result_code字段来判断退款是否成功,从而对订单状态进行处理和后续操作。不需要像支付那样等待另一个接口的通知来确定请求状态。当然如上文所说,如果需要微信服务器发送通知到后端的话,可以到微信商户平台进行设置。
    

小程序登陆和登陆状态维护

1.客户端调用 wx.login() ,获得返回参数 code//前端

2.客户端调用 wx.request() 将 code 发送到服务器//前端

3.服务器将 code 和存储在服务器的 appid 和 appSecret 共三个参数作为请求参数加入URL,向下面的微信服务器接口发起请求://后端

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

服务器会获得返回参数 openid 和 session_key 。这两个数据主要用在支付,数据签名,数据解密等与用户登陆态和标识有关的逻辑中。

openid是用户唯一标识,但不建议直接用做后端服务器的各用户标示符。

session_key 是针对用户数据进行加密签名的密匙。session_key在文件校验,获取用户具体信息时均需使用

一般为了安全起见,这两个数据都不会发往客户端,而是将3rd_session发送前端。

4.服务器应使用 openid 和 session_key 生成 3rd_session ,作为服务器派发给用户的登陆态标识token,用于用户的权限和数据管理。将其发送到小程序客户端。

5.小程序客户端将 3rd_session 存入 storage中。

6.后续用户进入小程序时,首先调用 wx.checkSession() 检测登陆态,如果失败,重新发起登陆流程。

ps.微信文档中说明使用 wx.checkSession() 来进行用户登陆态的时间管理,使开发者无需再开发用户登陆态时间管理逻辑,但实际开发中,wx.checkSession存在延迟,导致用户刚进入小程序时比较卡,所以建议开发者仍然自己去处理用户的登陆态过期时间管理,根据用户的token来使用相关逻辑进行处理。

7.如果检测用户登陆状态未失效,则从 storage 中读取 3rd_session。在需要用户标识的 wx.request() 时作为用户标识发送到服务器检验,服务器判断其是否合法。

ps.在生成 3rd_session 时,将 3rd_session 作为键,将 session_key + openid 作为值,存储在 服务器的 session 存储或数据库中。每个3rd_session都需要设置一个失效时间用来进行用户登陆态管理。

 
参考:https://www.cnblogs.com/yi1036943655/p/7211275.html
原文地址:https://www.cnblogs.com/brxHqs/p/9342778.html