Administrator
发布于 2024-08-01 / 161 阅读
0
0

微信、支付宝API接入(授权、支付)

一、前言

本文重点介绍作为一名开发人员如何接入微信、支付宝的 API 能力到自己的项目中,以 授权登录 支付 这两大场景做为切入点谈谈要做的工作。

二、授权登录

首先,讲讲授权登录,一般的登录需要在登录框里输入正确的账号密码才能登录成功,授权登录则不同,获取到微信或支付宝的 openid 即可视为登录成功。

openid 是用户在微信公众号/支付宝生活号( appid ) 下唯一的用户标识,公众号/生活号是他们在各自开放平台下的一个应用,都有一个唯一应用 id —— appid

站在微信、支付宝的角度,这叫做用户授权或者用户信息获取;只有站在开发人员的角度才有授权登录的说法,授权成功视为登录成功、视为网站合法用户

你可能会疑问这安全吗?微信、支付宝提供了临时授权码 code 的方式换取 openid,临时授权码不可伪造,开发者可以默认用户A不可能通过非法的手段让微信返回用户B的 openid 给网站

授权(类型)分两种:

  • 静默授权:用户感知就是进入页面闪一下(极短暂的白屏),直接完成登录。

  • 用户信息授权:用户进入页面,底部弹出授权控件,用户点击“同意”登录完成

静默授权只能拿到用户的 openid,用户信息授权可以额外获取到用户昵称和头像。openid 还是支付必须要用的参数。

API 调用流程:

  1. 微信:构造授权 URL(带上回调地址、授权类型),跳转到该 URL。用户同意后(静默可视为默认同意),跳回回调地址,回调地址上会带上临时授权码 code。
    支付宝:jsapi 直接调起授权控件,js callback 会返回临时授权码 code。

  2. 服务端通过 code 换取 openid 和 access_token

  3. (可选)如果是用户信息授权,可通过 access_token 获取用户信息

  4. 根据 openid 查询或创建网站用户,生成访问令牌 token

  5. URL 上携带访问令牌 token,301 重定向回网站首页

三、支付

支付分很多种:jsapi 支付、app 支付、h5支付、native支付(C扫B)、条码支付(扫码枪、B扫C)、小程序支付等等。常用的是 jsapi 支付,也就是在微信/支付宝内打开的页面,调用其 jsapi 能力完成支付。

jsapi 支付流程

1、服务端通过支付 api 传递 openid、订单号、金额、回调地址等参数给微信/支付宝,微信/支付宝生成预付单并返回支付参数

2、前端 js 通过支付参数调用 jsapi 弹出支付控件,用户输入支付密码完成支付。

3、回调地址接收到微信的通知,获取到支付结果,修改订单状态。

4、把订单编号放到消息队列中,启动业务订单处理。(我们公司的逻辑)

四、其他能力

1、授权 access_token 和基础(普通、全局)access_token

微信分授权 access_token 和 基础 access_token,支付宝估计差不多,不太了解。授权 access_token 只能用于授权,而基础 access_token 用途就很广泛了。

服务端调用微信的 API,必须要有基础 access_token。

前端 js 调用摄像头识别条码、分享等功能,需要用基础 access_token 换取 jsapiTicket 票据才能调用。

2、unionid

场景:网站应用(PC 端)微信网页应用授权,获取到的 openid 不同,但又是同一个用户,如何打通用户信息?可以通过开放平台将各个应用绑定在一起,绑定后授权会多返回一个参数 unionid,同一用户 unionid 是一样的。

注意:网站应用、小程序等应用通过开放平台创建。

3、PC 网站授权

PC 网站授权也是很常见的需求,开放平台创建 PC 网站应用,通过 API 获取授权二维码图片,然后放到登录页上,用户扫码后登录成功。

下面介绍另外一种 —— 通过公众号授权实现 PC网站授权的方式,无须创建 PC 网站应用

(1)PC 页面生成一个 uuid(唯一),用服务端接口 + uuid参数,生成二维码

(2)用户用微信扫码,访问服务端接口,接口带上 uuid 重定向到微信授权 URL,之后用户授权同意。

(3)授权回调会带上 uuid 和 openid,uuid - openid 作为 key - value 放到缓存

(4)PC 页面 js 用 uuid 定期轮询登录状态接口(比如每秒轮询一次),查到 openid 不为空表示登录成功,生成网站的 访问令牌 token(或其他方式)给前端,登录成功。

五、微信配置

1、接入微信公众号能力,登录公众平台(mp.weixin.qq.com

  • 业务域名、JS安全域名、网页授权域名(位置:设置与开发>账号设置>功能设置)

  • IP白名单、appsecret、appid(位置:设置与开发>开发接口管理>基本配置)

  • 检查接口权限,如网页授权(位置:设置与开发>开发接口管理>接口权限)

  • 成为开发者(位置:设置与开发>开发接口管理>开发者工具>web开发者工具,须配置个人微信号,关注公众号和公众平台安全助手)

2、接入微信支付能力,登录商家平台(pay.weixin.qq.com

  • 已开通微信支付

  • 获取商户简称、支付商户号 mchId(位置:账户中心>商户信息)

  • 支付授权目录【域名】(位置:产品中心>JSAPI支付>开发配置)

  • 获取密钥(位置:账户中心>账户设置>API安全>设置API密钥,32位,如果是客户给的可初步判断有没有给错。密钥分 v2 和 v3,见 7.1)

  • 授权公众号使用其支付能力(默认会绑定申请的公众号,如果是第三方公众号需要授权,见 7.2)

六、支付宝配置

1、接入支付宝生活号能力

  • 提交资料开通生活号

  • 加签密钥(RSA 方式,应用私钥、应用公钥、支付宝公钥)

  • 授权回调地址

有几点需要解释:

应用私钥、公钥使用支付宝的密钥工具生成,于支付宝开放平台>生活号应用>开发>开发设置中,上传应用公钥,上传后可获取到支付宝公钥。

应用私钥加密,发给支付宝,支付宝用应用公钥解密;支付宝返回数据用支付宝的私钥加密,我们用支付宝的公钥解密。解密成功,即验签通过,表示数据没有被篡改。

支付宝不像微信,只接收 ip 白名单的请求,支付宝不配 ip 白名单表示不限制 ip 来源、任何 ip 都能请求。

支付宝需要配置授权回调地址,可以勾选只验证域名,只有授权的地址(域名)才能调起授权控件;微信不同,微信是跳到微信的授权 URL 上授权,把回调地址放到 URL 即可,无须做配置。

七、补充

1、微信密钥分 v2 和 v3,用哪个?

我司目前用的是 v2,它们的区别:

v2 用统一下单 url(api.mch.weixin.qq.com/pay/unifiedorder),用 xml 传递参数。

v3 是 REST 风格,每种支付类型的 url 都不一样,url 上有 v3 字眼,用 json 的数据类型。

2、微信支付授权公众号

商家平台>产品中心>JSAPI支付>APPID账号管理,绑定公众号的 appid。

公众平台>广告与服务>微信支付>授权确认

3、微信参数清单

自用清单,第三方接入我们的系统时直接把清单扔给他们,让他们配置和提供。

appid:

appsecret:

mchId:

mchName:

keyV2:


评论