小程序
从后端接收来自客户端发过来的code,通过code获取openid和sessionKey,根据openid和sessionKey生成用户专属的token存入到用户数据库里,也可以存入Redis或者MongooDb里,同时把token返回给小程序。当用户再次打开小程序时会把之前的token或者sessionKey来识别用户,把用户从Redis或者MongooDb里检索出来,来锁定并维持用户的的登录状态
登录
新建mina.js用来专门存放小程序的路由。小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
server/routes/mina.js
|
|
注意:只开发微信网页的话用openid就可以,如果是开发小程序或多个产品时需要通过开放平台绑定公众号、小程序拿到unionid,unionid是跨平台的,一个用户在各个产品下都是一个unionid,如果是通过openid来辨识的话,openid是会变化的
使用code获取 session_key 和 openid
构建小程序函数。接收参数code,声明配置参数opts,发送请求传入opts返回数据
server/wechat-lib/mina.js
|
|
获取sessionKey
server/routers/mina.js
|
|
获取用户资料
通过openidAndSessionKey(code)
拿到用户资料,在数据里查到user,对拿到的数据进行加密解密
server/routers/mina.js
|
|
解密算法
小程序通过getUserInfo
拿到用户资料和敏感数据,需要对敏感数据解密
server/wechat-lib/mina.js
|
|
输入根路径进入index.vue页面跳转到二跳页面auth.vue拿到code,用code换token,再通过token拿到unionId和openid获取用户资料
公众号商城支付
增加中间件控制
pages/deal/index.vue和page/shopping/index.vue 都各自加上中间件
|
|
添加购买/取消动画框
点击购买后跳出弹出框
pages/deal/index.vue
|
|
添加控制数据
|
|
添加控制modal方法
|
|
唤起支付方法
拿到用户信息,判断字段是否填写正确,接着创建订单,处理数据成功后的处理,调用微信支付方法
|
|
支付接口调用
简要的说明下微信支付业务流程:
- 从客户端拿到预付订单
- 用户通过js-sdk发起微信支付的请求
- 对支付成功或失败的信息做处理
添加中间件
在页面初始化时,跟服务器端做加密的动作,让我们在微信网页的环境下把当前的域名包括页面注册到微信环境里,允许我们调用接口。
wechatInit中要做的工作其实是让微信知道在当前url能调用某些微信api接口的能力,发送getWechatSignature事件,在服务器端针对url进行加密,把签名值返回给前端。拿到全局微信sdk对象,通过config接口注入权限验证配置,通过ready接口处理成功验证,初始化微信按钮
static/mixins/wechat.js
|
|
添加实际支付行为
在deal页面中获取到当前商品后初始化网页端的微信支付行为,引入wechat中间件
pages/deal/index.vue
|
|
发起支付请求
|
|
注意:
到这里可能要止步了,没有支付权限,原因是没有认证过的服务号才可以申请微信支付功能,如果是订阅号,认证和不认证都不能用!
微信支付流程
微信支付分为下面几个步骤:
1、申请一个微信公众服务号
2、认证微信公众服务号
3、认证之后才可以做微信支付模块下在公众平台下微信支付功能权限的申请,申请后才有权限
4、在微信商户里设置网页授权的域名、js安全接口域名、业务域名等等,并且这个域名需要是备案过的,否则不能使用微信的支付功能
5、到商户平台->产品中心->开发配置,添加公众号支付授权目录
6、下载官方的示例代码,基于这个代码选择你要用的语言代码拷贝到你的项目目录
7、到商户平台下载API证书,设置API密钥(需要在服务器端基于证书和密钥在服务器上生成预支付订单,这两个没有设置也是不能使用微信的支付功能)
订单
订单数据
定义订单数据字段,需要关联两个对象user和product,payType表示支付方式(比如:支付宝、网银)
server/database/schema/payment.js
|
|
在存储数据之前判断,如果是新建数据的话同步更新时间。
创建订单
server/routes/wechat.js
|
|
向微信支付系统发起支付请求
有时候在本地做域名代理时可能会带::ffff:
类似于这样的标识,替换成''
即可。
用户初次登录公众号网页时会进行授权,授权后就持有用户的信息,就可以持久化session。通过productId获得product,判断它的状态。
通过session.user.unionid查找到user,判断如果不存在,创建User存入数据库。
定义订单参数,生成预支付订单,继而生成订单。
server/controllers/wechat.js
|
|
支付方法
引入第三方库wechat-pay支付方法
server/wechat-lib/pay.js
获取预支付订单
|
|
获取订单数据
|
|
订单微信推送通知
|
|
获取所有订单列表
|
|
获取订单
|
|
失败信息
|
|
成功信息
|
|
订单管理页面
pages/admin/payments.vue
|
|
增加中间件
|
|
获取支付数据
|
|
路由
server/routers/admin.js
|
|
store/actions.js
|
|
请求路径
store/services.js
|
|
启动服务和代理
将sunny二进制文件复制到项目,另外再创建一个shell文件写入配置,配置就是启动sunny的shell命令
server/bin/ngrok
|
|
添加服务启动配置,修改package.json
|
|
给ngrok文件添加权限
|
|
这样就可以在在同一个目录下通过npm run dev启动本地开发编译环境,同时也可以通过npm run ngrok启动代理端口的工具环境。
编译压缩
修改package.json
|
|
执行编译命令:
|
|
编译后启动命令:
|
|
分离本地与线上环境
区分本地环境与线上环境,通过NODE_ENV进行文件切换。
新建本地开发环境文件development.json
server/config/development.json
|
|
线上文件production.json
server/config/production.json
|
|
根据当前nodejs运行时NODE_ENV是开发环境还是线上环境进行切换,修改文件:
server/config/index.js
|
|