有关微信开发的总结
一.首先大致分享一下官方开发文档:
公众平台-小程序开发文档:
https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html
公众平台技术开发文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141229
开放平台-开放资源:
微信支付开发文档:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4#
微信开放社区
https://developers.weixin.qq.com/community/
公共平台接口调试工具:
https://mp.weixin.qq.com/debug/
微信卡卷签名校验工具:(不推荐,貌似有问题)
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign
二.分享下几个处理过或者是研究过的东西:
1. 第三方授权以及小程序发布流程方面:
我们的业务决定 我们开放第三方平台来服务客户,来对旗下授权给我们第三方平台的小程序,开发小程序等一套完整的流程。
首先,我们目前已经实现的流程大致如下:
- 每个店铺管理员直接在商户后台就可以直接进入小程序页面自己设置,付款之后,跳转到绑定小程序账号 授权第三方页面,注册小程序账号
- 授权之后,我们就可以正式进入小程序详情页面和 版本管理页面,
- 在详情页,目前展示了一些小程序账号的基本信息,已经最下方可以设置小程序的支付信息,通过这个来判断小程序是否可以正常使用(无支付信息的话或者是支付信息不匹配,下单的时候都会报错)
- 在填写完支付信息之后,下一步就是在版本管理界面,用户目前仅两步即可完成小程序的发布,我们现在在最底部的开发版本中展示最新的开发版本(super 后台设置的默认模板),点击提交审核按钮,后台做的操作是上传代码和提交审核两步;然后等待微信官方审核结果,审核通过之后,会出现发布上线按钮,直接点击即可发布。
我们再看看处理关键逻辑的代码块如下:
- 商户后台小程序设置的接口: 在 admin.py 中的Class WxMiniProgram, 这个类get 请求中处理的小程序绑定,跳转授权页面的逻辑,以及授权之后回调页面的处理;post 请求中,我们是这只小程序账号支付信息,包括提交支付证书参数,缓存证书文件的操作,
- 用户管理小程序代码版本的接口:在 admin.py中的 Class WxMiniCodeProgram,在 prepare 方法中,做一些初始化的准备,或者第三方的 component_access_token, 以及默认模板信息default_template;然后通过 put 请求进行:获取小程序信息,上传代码,提交审核,发布小程序,撤销审核,体验二维码这六步,
- 第三方开放平台管理的基类接口:在 openwx.py 中的Class OpenComponent, 这个类是公众号 或者小程序绑定到第三方开发平台的公共基础接口,都请求微信服务器完成的,包括获取component_access_token, pre_auth_code,authorizer_access_token,authorizer_refresh_token,access_token等一些请求时必须带上的授权码,还有一些获取公众号或者小程序的基本信息,获取小程序代码模板,上传,提交,发布等等接口方法。
- 微信服务器回调接口: 在 apply.py中,Class Wxopen 这个类是接收微信开放平台授权事件的推送,post 请求中处理,微信推送的授权消息和取消授权的消息,以及第三方平台的凭证 component_verify_ticket(微信服务器每10分钟推送刷新一次); Class WxMessage 这个类是接收森果服务号回调的接口; Class WxEvent 这个类是绑定到我们森果第三方开放平台之后公众号回调接口,这两个类分别对不同状态(event),不同场景(scene)做了处理。比如有:关注,扫码等,并且拼接需要返回给用户的reply-message 发送给用户;
- 小程序调用的接口: 在 applet.py 中, 处理了小程序需要调用的登录,绑定手机,个人中心,以及首页的逻辑,其他的 逻辑都在 customer.py 里面 和微商城公用,用come-form =wx_applet来进行规避;登录逻辑中,会判断此用户是否是绑定过手机号的用户,然后更新绑定过手机号的 customerid的 cookie和 token;若没有绑定手机号,进行绑定手机号,并且修改 bind_customer_id值为已有手机号的 customerid, 实现账号统一;
2. 微信公众号、小程序授权登录方面:
用微信浏览器访问第三方网页的时候,公众号,小程序可以用个授权的机制,来获取用户的微信信息,官方文档大致流程:
- 用户点击同意授权,获取 code;然后通过 code 获取网页授权access-token 授权码,其中code 每次请求授权的时候都不一样,并且5分钟内不用就过期; access_token 这个值有效期一般在两个小时,需要重新刷新获取;最后获取用户信息;(注:用户信息里面,只有在公众号绑定到第三方平台上面的时候,用户信息里面才会带上 Unionid)
- 关于静默授权,携带 Scope=snsapi_base 参数的,只用来获取用户的 openid,用户无感知,直接跳转第三方连接;还有一种用户已经关注过公众号,授权过小程序,或者是从会话或自定义菜单进入授权网页,即使是 scope =snsapi_userinfo 也属于静默授权;
森果零售系统的微信登录部分代码:
- 账号登录的基类接口: 在 base.py 中的 Class _AccountBaseHandler 这个类中处理了各种登录生成登录url链接的接口;以及还有微信公众号二维码和绑定第三方的公众号二维码等等接口;
- 微信授权的基类接口:在pub_base.py 中的 Class WxOauth2 这个类是请求微信微信服务器的一些公共方法接口,包括获取用户信息,openid, unionid,以及发送微信模板消息, 还有绑定第三方公众号的 access_token等
- 森果系统登录校验 passport 的公共接口:在pub_func.py 中的 Class AuthFunc,这个类主要是处理了一些登录方面的接口,校验passport 表,更新 passport 表 和 accountinfo 表的信息,login_by_wx处理微信登录的情况下,创建新用户,update_through_wx更新用户信息等操作,还有其他登录方式入口;
3. 微信卡卷方面:
卡卷方面大致的流程如下:
- 微信卡卷大致开发流程分为:创建卡卷,投放卡卷,领取卡卷,核销卡卷,管理卡卷;
- 目前森果系统商户后台新建优惠券的时候,新增一个同步至微信卡卷的开关,只有在商户开通对应的公众号且授权给森果第三方的时候才能开启这个同步至微信卡卷的功能,后台我们会根据开关状态,对应的在生成卡卷的时候,同时请求微信服务,创建对应的优惠券,然后在跳转领取卡卷界面,判断是否是在微信浏览器,微信浏览器就携带参数 cardExt 和 card_id 发送给前端,前端通过jsapi-sdk 中的 wx.addCard方法拉起微信卡卷领取界面,然后用户点击领劵,卡卷就加入到微信卡包当中,同时如果用户没有领取,直接发送action=wx_reback,表示微信领劵未成功,但是森果系统的卡卷仍然可以使用。
- 现在微信卡卷这个功能只是最最基础的,并且不仅仅只有优惠券,还有其他卡卷类型,比如:会员卡,团购卷,折扣卷,礼物卷,代金券,兑换卷等等;后续可能还需要增加对应的扩展,比如:用户自定义标题,用户自定义卡卷描述,自定义卡卷背景图片等等;还有第三方卡卷待制卡模式,在商户没有公众号,或者是公众号没有认证的时候,需要商户授权给我们森果平台,然后通过强授权模式也可以创建卡卷。
卡卷代码如下:
- 创建卡卷的逻辑,在 adminMarketing.py 中的 class Marketing 的 post 请求中 action = addcoupon 的时候,添加优惠券的时候,增加 is_wx_ticket 的判断,是否同步至微信卡卷,并且发起创建卡卷的请求;
- 请求微信卡卷的基础接口,在 openwx.py 中的 class WXTicket , 这个类里面都是微信卡卷相关的接口,包括上传图片,创建优惠券,生成二维码,核销优惠券,还有包括导入自定义 code,查询导入的 code,核查 code 数目,修改库存接口,和一个获取 api_ticket 的接口(用于卡卷签名)
- 领取卡卷的逻辑, 在activity.py 中的 class CouponGrub 的 post 请求中,当 action=”get_coupon“ 的时候,表示用户点击了领取卡卷,如果是在微信浏览器中打开以及是否同步至微信卡卷的条件来判断是否需要写到 card_id 和 cardExt 参数给前端拉起微信卡卷界面,其中 cardExt 这个参数集,需要nonce_str 随机数,timestamp时间戳,和一个签名文件signature;
- 核销卡卷的逻辑,分别有两处:都是在将卡卷状态置为已使用;
一个是在收银台 cash.py 当中balance_addbycashier,
另一个是在微商城 customer.py 当中_post_check_coupon
微信卡卷如果在过期时间内打开卡卷,会立即显示成未已过期的状态,暂时 不需要添加设置过期的接口;
4. 开发过程遇到的坑和一些注意的事项:
1. 汇总一下各种不同的 token 值:
access_token :小程序 ,公众号, 服务号未绑定第三方的授权码,一般用 appid 和 appsecret 即可获取
authorizer_access_token:(和auto_access_token 一样): 绑定到第三方后的授权码,需要根据authorizer_refresh_token来获取,可以使用直接封装好了的方法WxOauth2.get_other_accessToken(admin_id)来拿到
authorizer_refresh_token: 绑定到第三方平台时获取的刷新码,在数据库中取得,如果这个值有异常,获取不到对应的 access_token。
component_access_token: 第三方平台的授权码,可以通过 OpenComponent 对象调用get_open_component_access_token()来获取,
component_verify_ticket: 第三方平台授权验证码(微信服务每10分推送),这个是开放平台组件认证;
pre_auth_code : 在 小程序,公众号授权给第三方平台的时候先请求的code,即:预授权码
jsapi_ticket : 这个是微信 js-sdk 调用的时候,签名的时候需要这个值
api_tikcet: 这个是微信卡卷调用js拉起微信界面的时候,也多需要这个值签名
2.遇到过的报错:
1. invalid credential, access_token is invalid or not latest
解:access_token 授权码过期,需要重新获取,或者是重新授权即可。
2. Api is unauthorized to component
解:对用公众号或者小程序未授权给第三方平台,无法调用对应的 api 接口,首先去对应的账号下检查是否已授权,重新授权即可。
3. stock is out of limit
解:这个报错没有设置库存,库存为0
4. access clientip is not registered
解:访问ip地址 没有加入白名单中,需要在第三方平台的白名单中添加对应的 ip 地址;
5. 'refresh_token is invalid
解:刷新授权码不符合,重新授权,或者重新刷新 access_token
6. component experience version not exists
解:提交审核的版本不存在,需要重新上传模板,然后提交审核版本;
7. 小程序中微信下单,出现获取不到 openid(小程序)?亦或者是出现 mch_id 和 appid 不匹配的情况
解:未找到 openid 是由于用使用绑定之后 bind_customer_id 来查找对应 customer_id, 所以没有对齐导致异常;商户号和 appid 没有对齐的很大可能由于 小程序账号里面没有绑定对应的商户号;
8. no domain to modify after filter,please confirm the domain has benn set in miniprogram or open hint
解: 这个报错是由于修改小程序服务域名和业务域名的时候报错,可能是由于设置的域名根 第三方开放平台配置的域名不一致导致的,需要统一;当时我解决把这个报错信息屏蔽掉,无论设置成功与否,都直接发布。
9. 获取组件方接口预授权码失败 : pre_auth_code 没有这个值可能原因:component_access_token 这个值过期导致,
10. 获取组件方接口调用凭据失败: component_access_token 这个值获取失败,可能原因 component_verify_ticket 这个值过期,没有刷新
11. 待补充。。。。
3. 遇到的坑:
- 公众号 授权给第三方后,旗下的小程序不一定授权给第三方;还需要重新授权一次小程序。
- 微信开发平台开发文档中,代小程序实现业务栏中的代码管理,获取小程序体验二维码的 url 中间,多了一个空格!!
- 通过 openid 获取用户的信息的时候,如果公众号没有绑定到第三方开放平台上的话,是不能获取到 UnionId 。
- 微信开发者工具,必须在配置中 appid 和 settings.js 中的 appid,还有访问的数据库 appid,这三者必须全部一样,和数据库中对应的 appsecret 才能正常访问小程序;(线上:乡下小卖部;线上测试:森果测试)
- 微信开发者工具上传模板代码的时候,需要携带 ext.json, 老版本的开发工具确实有问题,导致无法上传成功,现在可能已经解决; 也有可能是由于 ext.json 里面配置了默认的 appid 和 shopid 导致的;
- 小程序中 cookie 的设置,购物车里面设置 mCart 和cart_count ,以及存在秒杀 活动的时候, Seckill_goods_ids不是 fruit 表里的 id,而是秒杀商品表中的 id;包括限时折扣和会员价问题
- 跳转微信领取卡卷时候,需要先加载 wx.config 成功完成之后,才能再次启用 wx.addcard;第一次加载的时候需要 jsapi_ticket 进行鉴权认证,第二次需要请求 api_ticket 对 cardExt 中的 signture 加密之后传入,几个参数是以字典序拼接起来的字符串,然后通过 sha1加密,不然这个地方一直报签名错误,参数错误可能是由于需要传入字符串类型,而不是 json 对象;
- 微信官方提供的卡卷签名工具,生成的结果,与能正常生成卡卷,领取卡卷返回的参数不一致。。。。他没有按照字典序排序,导致签名加密都错误;这个地方也有可能是自定义 code(非全数字的原因导致的,还有待研究)
- 待补充。。。
- 待优化和完善的地方:
小程序方面:
- 在小程序基本信息页面,各个条目的修改设置接口,以及二维码下载接口。
- 第三方平台可以快速创建小程序接口,为商户创建小程序账号,默认就是已认证,可减少成本。这种接口只能创建线下类目小程序----可见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
- 修改服务器域名这块逻辑,目前放在授权的时候进行修改,之前如果修改失败会有404 的报错信息,用户体验不好,将报错取消,每次都需要去商户后台检查这个服务器域名是否修改完成。
- 连锁店铺的小程序研究方向
- 小程序到期,续费处理逻辑
卡卷方面:
- 会员卡打通- 森果会员卡系统和微信会员卡系统打通
- 其他几种卡卷的应用 - 折扣卷, 团购卷, 兑换卷, 代金券
- 线上和线下 对卡卷进行核销,做到统一同步更新,并且有核销消息推送
- 卡卷与小程序打通,互相跳转
待补充。。。。