这是我参与更文挑战的第6天,活动详情查看: 更文挑战
背景
以前做过微信公众号相关的工作,本文说一下主要重点,不涉及到什么代码。我们的客户是有一个多家子公司,然后每个子公司都有自己的微信公众号。总公司希望使用总公司的微信公众号对所有子公司的用户进行授权。这样以来,总公司拿到所有子公司的用户信息,并且收款统一走总公司的支付商户。这里没有太多的文字说明,具体都在图上。
微信授权基本知识
开发前准备
具有网页授权的微信公众号/开发者账号
因为我们这里有准备好的微信公众号,所以没什么问题,就是公众号需要开通相关的接口。
开发环境需要的服务器和域名,域名解析到服务器,配置IP白名单
基本设置 -> IP白名单
公众号设置 -> 功能设置 -> 域名绑定 [ JS接口安全域名 、网页授权域名 ]
校验文件需要上传到服务器上,域名才可以绑定成功
网页授权
网页授权前后端交互流程
前端代码书写
window.location.href=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${window.location.origin}/api/wp/auth?params=${params}&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect`;
微信公众号菜单跳转连接先跳转到前段页面,然后跳转微信校验,回调回到后端,在重定向到前端。
阿里云环境注意事项
配置IP白名单的时候,阿里云可能需要配置两个ip,一个是入口ip,另一个是出口ip,可以在系统报错的时候查看具体的ip信息。
支付配置
添加商家账户
微信公众号 -> 微信支付 -> 关联支付商户
支付所需配置参数
具体的api 文档:pay.weixin.qq.com/wiki/doc/ap…
商家支付授权域名
前端支付操作
单微信公众号授权多微信公众号
场景
可能公司有多家子公司,总公司想要通过总公司的公众号去授权引流所有分公司的用户信息。这里的引流说的不是公众号关注引流,而是用户信息。
正常的微信公众号进行授权,如下图:
那到底是什么来决定用那个公众号进行授权的呢?
就是下面代码里的appId。
window.location.href=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${window.location.origin}/api/wp/auth?params=${params}&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect`;
如何在多个微信公众号进行单微信号授权
关键点就是这里的appId,并不是随着不同的微信号修改,而是所有的微信公众号都使用单一的微信公众号appId以及secreat。
如何配置配置开发,测试,生产环境
多个环境意味着在不同的环境会使用不同的微信公众号去验证。
开发环境
测试环境/生产环境
当我们需要部署测试环境和生产环境的时候,需要基于开发环境做哪些修改呢?如下图所示,相关的数据以及配置都要修改。
数据库字段说明
{
"cityId":"872",
"cityName":"****",
"wx_token":"token",
"wx_app_id":"xxxxxxxx",
"wx_secret":"yyyyyyyy",
"sub_app_id":"xxxxxxxx",
"sub_secret":"yyyyyyyy",
"deletedStatus":"0"
}
我们上面说的appId和secret指的输数据库里的sub_app_id,sub_secret。因为两个字段是用来授权用的,就是开发环境/测试环境/生产环境,这两个字段都是一样的。因为是单一微信公众号授权多微信号的。
扫码推送消息场景
流程图
扫码场景在当前生活当中已经很常见了。
二维码相关文档
developers.weixin.qq.com/doc/offiacc…
微信推送消息需要启用微信公众号服务器。需要进行相关配置才可以。
后台接口书写
假设上方的接口为/testCallBack/${storeId}。会有两个同名接口,一个是get/post。
- get请求是在我们配置微信服务器,启用的时候会进行校验,如果没有这个接口,校验会失败。
- post请求则是具体的业务响应消息。
/**
* 测试微信回调
*/
@GetMapping(value = "/testCallBack/{storeId}")
public void testWxCallBack(@RequestParam(name = "signature", required = false) String signature,
@RequestParam(name = "timestamp", required = false) String timestamp,
@RequestParam(name = "nonce", required = false) String nonce,
@RequestParam(name = "echostr", required = false) String echostr,
@PathVariable(value = "storeId") String storeId,
HttpServletResponse response) {
****
****
****
}
/**
* 微信回调消息处理
*
* @param request
* @param response
* @throws IOException
* @throws DocumentException
*/
@PostMapping(value = "/testCallBack/{storeId}", produces = {"application/xml; charset=UTF-8"})
@ResponseBody
public void testWxCallBack() {
****
****
****
}
和单微信号授权集成
这里的矛盾点是:假设我们有二十家子公司,每家子公司都有自己的微信公众号,子公司通过二维码扫描可以进行引流,这里引流就是用户需要去关注子公司的微信公众号。但是关注子公司之后跳转的页面还是通过总公司的微信公众号授权的。
- 单微信号授权
- 多微信号推送消息
数据库字段说明
{
"cityId":"872",
"cityName":"***",
"wx_token":"token",
"wx_app_id":"xxxxxxxx",
"wx_secret":"yyyyyyyy",
"sub_app_id":"xxxxxxxx",
"sub_secret":"yyyyyyyy",
"deletedStatus":"0"
}
- "wx_token": 进行二维码推送使用,指的是上面多微信号推送子公司微信公众号的token
- "wx_app_id": 进行二维码推送使用,指的是上面多微信号推送子公司微信公众号的appId
- "wx_secret": 进行二维码推送使用,指的是上面多微信号推送子公司微信公众号的secret
- "sub_app_id": 进行授权使用,指的是上面单微信授权总公司微信公众号的appId
- "sub_secret": 进行授权使用,指的是上面单微信授权总公司微信公众号的secret
数据库字段总结:
- sub字段在不同的环境下是不同的,同一个环境下,所有子公司的配置都是一样的。
- wx字段在不同的环境下是一样的,在同一个环境下,所有子公司的配置是不一样的。