微信小程序发起微信支付 (1)原理简述

微信小程序发起微信支付 (1)原理简述

最近由于竞赛的原因,开始学习移动支付技术及微信小程序的开发。本文作为笔者的学习笔记,以腾讯官方的开发者文档为基准,试图简单地讲清楚在微信小程序中发起微信支付的原理、实现过程,以及具体应用到小程序上是如何实现的。

文章目录

  • 微信小程序发起微信支付 (1)原理简述
    • 微信支付分类
      • 1.支付种类:
      • 2.支付工具
    • JAPI支付
      • 1.JAPI支付定义
      • 2.JAPI的支付接口及其规则
        • 2.1 API规则
        • 2.2 签名算法
      • 2.3 JAPI支付交互环节设计细则
    • 小程序支付
      • 1.小程序支付的调起api
      • 2.wx.requestPayment(OBJECT)
    • 总结

微信支付分类

参看微信支付开发者文档(此处引用的是普通商户),可见微信支付大致分为以下种类:

1.支付种类:

分为付款码支付、JAPI支付、NATIVE支付(即扫描商家二维码支付)、APP支付、H5支付(即网购平台第三方支付)、小程序支付、刷脸支付。
微信小程序发起微信支付 (1)原理简述_第1张图片
可见,小程序中的微信支付本质上来说是H5支付的一种,只不过是通过小程序来调用的。

2.支付工具

现金和优惠券、现金红包、企业付款、分账。
微信小程序发起微信支付 (1)原理简述_第2张图片

JAPI支付

1.JAPI支付定义

通过查看官方文档可知,JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

因此也可以说,H5支付、JAPI支付以及小程序支付三者本质上是交叉概念。

2.JAPI的支付接口及其规则

2.1 API规则

从字面意思便可看出,JAPI支付最重要的便是接口的调用,其主要涉及的API规则如下:

规则 说明
传输方式 为保证交易安全性,采用HTTPS传输
提交方式 采用POST方法提交
数据格式 提交和返回数据都为XML格式,根节点名为xml
字符编码 统一采用UTF-8字符编码
签名算法 MD5/HMAC-SHA256
签名要求 请求和接收数据均需要校验签名
证书要求 调用申请退款、撤销订单、红包接口等需要商户api证书,各api接口文档均有说明。
判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态

2.2 签名算法

通过阅读API规则可见,规则中最重要的便是其签名规则。那么首先问题来了,此处的签名肯定不是我们日常生活中一般意义上的手写签名,指的是数字签名。那么“数字签名”是个什么玩意儿呢?
我们先来看一下百度百科中关于数字签名的定义:

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。

可见,虽然我们在使用微信支付时,虽然app只要求我们输入自己的固定支付密码,但其系统内部其实是做了一个加密的环节来保证资金安全的。下面再来看一下官方文档中的签名算法的解释。

签名生成的通用步骤如下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
同时,由于微信支付API接口协议中包含字段nonce_str,而这一字段采用的是随机数的生成法。
简而言之,数字签名由于每次接受的参数以及生成的随机数具有高样本空间性和随机性,保障了支付时的安全性。

2.3 JAPI支付交互环节设计细则

(1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。

(2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示。

(3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。

注:(2)和(3)的触发不保证遵循严格的时序。JS API返回值作为触发商户网页跳转的标志,但商户后台应该只在收到微信后台的支付成功回调通知后,才做真正的支付成功的处理。

以上便是JAPI支付的简介及部分细则,由于本文的重点在于小程序支付,本部分只是作为一个铺垫,故不再作深入探讨。

小程序支付

小程序支付,顾名思义便是只能在小程序内发起的支付。相比起通常意义上的H5支付和JAPI支付,小程序支付主要是在API上有一些改变。
小程序的支付主要由两块构成:调用api和小程序自带的支付功能函数来实现。即通过支付函数对api的调用来实现支付功能。

1.小程序支付的调起api

微信小程序发起微信支付 (1)原理简述_第3张图片

2.wx.requestPayment(OBJECT)

微信小程序支付时主要的功能函数,在index.js文件下实现
Object参数说明:
微信小程序发起微信支付 (1)原理简述_第4张图片
该部分参数的定义及使用需要通过后台(PHP/Java)的搭建来实现,将会在我后续的博客中展示。
requestPayment()函数会产生回调值,其定义如下:
微信小程序发起微信支付 (1)原理简述_第5张图片

总结

微信小程序中的支付环节本质上和H5支付、JAPI支付时交叉概念,只是其用于小程序中发起的的支付。另外由于微信关于小程序的开发做了较多的完善,因此在实现时自带了扩充的js库函数,方便了开发者开发。在下一篇博客中,我将搭建一个完整的具备前端与后台的简单的带支付功能的小程序。

你可能感兴趣的:(小程序开发,前端,移动开发,小程序,前端,移动开发)