上上周五接到这个任务,场景是希望用户可以在小程序内一键开卡,返回小程序的时候,若用户非会员,则把开卡信息一键同步到会员信息中去。
查看微信小程序文档的小程序&会员卡打通,我们的流程应该是非跳转型一键开卡+通过App.onShow()里面refererInfo.extraData里面获取到activate_ticket card_id code等参数用于下一步操作。
于是,经过流程
- 后端创建会员卡card/create,生成card_id
- 后端设置开卡字段接口card/membercard/activateuserform
- 后端获取开卡插件参数card/membercard/activate/geturl,生成跳转开卡组件所需参数
- 前端小程序内打开开卡插件的接口
- 用户完成一键开卡,前端在App.onShow() 获得返回值,传给后端
- 后端获取用户开卡信息,同步会员信息card/membercard/activatetempinfo/get
问题出现在5,App.onShow()返回的extraData为undefined,上网查询之后,发现开卡时有一个值wx_activate_after_submit_url需要填写,才能返回App.onShow()需要信息。但填写之后,还有更多的坑:
1. 填写后,由原先的非跳转型变为跳转型,无法实现开卡组件内激活会员卡,需要商户自己调用激活接口。
2. 流程不对,本来填完信息会跳转到卡面信息,点关闭才返回小程序,跳转型则是填完信息后就返回小程序。
通过反复试验,发现wx_activate_after_submit_url这个值实际上决定了会员卡是跳转型还是非跳转型,因此陷入僵局。
偶然在微信支付的文档上看到,跳转开卡组件的值里面还有card_code
于是想到,可不可以自定义会员卡code,用这个code去获取会员信息。既能保证非跳转一键开卡,又可以拿到用户的开卡信息。就在extraData里面加了几个参数
create_card_appid: '...', //公众号appid
card_id: card?.cardId,
card_code: params?.code,
activate_type: 'ACTIVATE_TYPE_NORMAL', //激活类型
后端那边,要记得把会员卡库存设为0,同时通过接口去自定义code值。
跑了一次,可以实现。