加载中...

获取小程序码(一物一码)实现方式

获取小程序码(一物一码)实现方式

先放小程序官方文档:获取小程序码

 

要求实现:获取小程序码,且无数量限制。

New Image

 

 实现思路:

1、点击按钮后调接口,接口返回小程序码;

2、把小程序码传给Dom模板,模板是自定义的,可在页面上渲染成任意自己想要的样子。

3、注意:用户扫描小程序码进入到的指定页面, 在 onLoad() 生命周期取参时需要区分用户是扫码进入的还是正常通过url跳转进入的,2种进入页面的取参方式不同。

 

具体步骤:

1、js代码

  1. show_post() {//按钮点击事件
  2. var that = this;
  3. that.get_qrcodes(function (qrcodes) {
  4. wx.showLoading({
  5. title: ''正在生成中...'',
  6. mask: true
  7. });
  8. setTimeout(function () {
  9. wx.hideLoading();
  10. wx.showToast({
  11. title: ''海报已生成'',
  12. icon: ''success'',
  13. duration: 1500
  14. })
  15. that.setData({
  16. showPost: true,
  17. template: new ImageExample().palette(that.data.image1, qrcodes)
  18. });
  19. // 说明:
  20. // ImageExample() --自定义的海报模板
  21. // that.data.image1 --生成海报需要的图片
  22. // qrcodes --接口返回的小程序码
  23. }, 1000)
  24. });
  25. },
  26. get_qrcodes: function (cb) {//调接口取二维码
  27. var that = this;
  28. var paramData = {};
  29. paramData.sign = app.globalData.signture;//这个是自己项目请求接口时必传的参数,跟生成小程序码没关系。
  30. paramData.big = ''200'';//设置小程序码的宽高
  31. paramData.page = ''pages/activities/doubleEleven/eleven_index/eleven_index'';//设置扫描小程序码后跳转的页面
  32. /* 用scene来传参,传参时有些地方要注意:
  33. 一般情况下参数的拼接方式是这样的:goodsId=111&sourceUuid=222
  34. 但是这里的等号要用一个特殊符号代替,因为有多个参数时,用等号拼接,在onload()里取参会取不完整。只能取到goodsId=111,后面的参数取不到。
  35. 具体是什么原因造成的,不知道。反正用特殊符号"*"取代就可以取到完整参数。
  36. 这里建议不要用"/"符号,因为如果参数里有url或者图片链接时,这些参数值里也有"/",onload()里通过"/"截取参数会有问题。
  37. */
  38. if(that.data.sourceUuid){
  39. paramData.scene = ''goodsId*''+that.data.goodsId+''&sourceUuid*''+that.data.sourceUuid;
  40. }else{
  41. paramData.scene = ''goodsId*''+that.data.goodsId;
  42. }
  43. wx.request({
  44. url: app.globalData.getRequestUrl(''chargeBModeKmjLinkQrimgScene''),
  45. data: paramData,
  46. method: ''POST'',
  47. header: {
  48. ''content-type'': ''application/json''
  49. },
  50. success: function (res) {
  51. if (res.data.data.code != 0) {
  52. wx.showToast({
  53. title: res.data.data.msg,
  54. icon: ''none'',
  55. mask: false
  56. });
  57. }
  58. that.setData({
  59. qrcodes: ''data:image/png;base64,'' + res.data.data.base64
  60. })
  61. cb(''data:image/png;base64,'' + res.data.data.base64) //返回小程序码
  62. },
  63. });
  64. },
  65. class ImageExample {//海报模板
  66. palette(image1, qrcodes) {
  67. return ({
  68. width: ''750rpx'',
  69. height: ''1040rpx'',
  70. borderRadius: ''15rpx'',
  71. views: [
  72. {
  73. type: ''image'',
  74. url: image1.replace(''http'', ''https''),
  75. css: {
  76. width: ''750rpx'',
  77. height: ''690rpx'',
  78. left: ''0rpx'',
  79. top: ''0rpx''
  80. },
  81. },
  82. {
  83. type: ''image'',
  84. url: qrcodes,
  85. css: {
  86. top: ''700rpx'',
  87. width: ''200rpx'',
  88. height: ''200rpx'',
  89. left: ''50rpx'',
  90. },
  91. },
  92. {
  93. type: ''text'',
  94. text: ''长按识别二维码参团哦'',
  95. css: {
  96. height: ''80rpx'',
  97. right: ''48rpx'',
  98. top: ''840rpx'',
  99. color: ''#999'',
  100. fontSize: ''30rpx'',
  101. lineHeight: ''84rpx'',
  102. textAlign: ''right''
  103. },
  104. },
  105. {
  106. type: ''image'',
  107. url: ''https://m.qxdaojia.com/static/html_list_static/img/list/post_bot_img.png'',
  108. css: {
  109. top: ''910rpx'',
  110. width: ''750rpx'',
  111. height: ''129rpx'',
  112. left: ''0rpx'',
  113. },
  114. },
  115. ],
  116. });
  117. };
  118. }

 

生成小程序码接口参数解释:

New Image

 

2、Dom部分:template就是封装好的模板。

New Image

  1. <!-- 海报 -->
  2. <view class="follow_views" wx:if=''{{showPost}}''>
  3. <view class="flex-column down_load_pop" bindtap="close_post">
  4. <view class="flex-column down_load_cont" catchtap="postcatch">
  5. <painter palette="{{template}}" bind:imgOK="onImgOK" style=''border-radius:15rpx;position:fixed;left:-100vw;'' />
  6. <scroll-view scroll-y style="width:650rpx;height:auto;max-height:76vh;box-shadow: 0 1px 18px rgba(0, 0, 0, .72);border-radius:15rpx;">
  7. <image src=''{{imagePath}}'' style="width:650rpx; border-radius:15rpx;display:block" mode=''widthFix'' show-menu-by-longpress/>
  8. </scroll-view>
  9. <image src=''https://m.qxdaojia.com/static/html_list_static/img/goods_detail/close.png'' class="post_close" bindtap="close_post" />
  10. <view class=''saveButton'' bind:tap=''saveImage''>保存图片</view>
  11. <view style="color:#666;font-size:12px;line-height:50rpx">保存图片到手机后,将图片分享好友、朋友圈</view>
  12. </view>
  13. </view>
  14. </view>

最后生成的海报样子:

New Image

 

3、扫小程序码之后进入指定页,onload()取参方式。

  1. onLoad: function (options) {
  2. if(options.scene){
  3. //scene有值说明是扫小程序码进入的当前页面,取参数的方式需要改变
  4. //options.scene取到的是 "goodsId*111&sourceUuid*222",要把字符串转换成obj。
  5. }else{
  6. //正常方式跳转进来,可以直接从options里取参。
  7. that.setData({
  8. goodsId: options.goodsId,
  9. sourceUuid: options.sourceUuid ? options.sourceUuid : "",//客户经理开团会带有sourceUuid
  10. })
  11. }
  12. },

4、最后有一点要注意,scene对参数长度有限制。

解决方案:

前端人员在调获取小程序码接口的时候传参,后端人员在后台对参数进行MD5加密,无论传了多少个参数,加密后会生成一个16位的字符串,这样就不会超过32个字符的限制。

前端在onload()取到加密后的16位scene,再调一个接口对参数进行解密。

New Image

 onload() 代码如下:

  1. onLoad: function (options) {
  2. var that = this;
  3. if(options.scene){
  4. //scene有值说明是扫小程序码进入的当前页面,取参数的方式需要改变
  5. //调接口把加密的参数进行解密
  6. var paramData = {sceneEn:options.scene};
  7. wx.request({
  8. url: app.globalData.getRequestUrl(''sceneEncrypt''),
  9. data: paramData,
  10. method: ''get'',
  11. header: {
  12. ''content-type'': ''application/json''
  13. },
  14. success: function (res) {
  15. // console.log(res.data);
  16. if (res.data.code == 0) {
  17. var sceneStr = res.data.scene_decrypt;
  18. var arr = sceneStr.split("&");
  19. var obj={};
  20. arr.forEach(function(e){
  21. var nameStr = e.substring(0,e.indexOf("*"));
  22. var valueStr = e.substring(e.indexOf("*")+1,e.length);
  23. obj[nameStr] = valueStr;
  24. })
  25. console.log("解密后的参数:");console.log(obj);
  26. that.setData({
  27. goodsId: obj.goodsId,
  28. sourceUuid: obj.sourceUuid ? obj.sourceUuid : "",
  29. })
  30. }else{
  31. wx.showToast({
  32. title: "页面参数解密失败,请重试!",
  33. icon: ''none'',
  34. mask: false
  35. });
  36. }
  37. }
  38. });
  39. }else{
  40. //正常方式跳转进来,可以直接从options里取参。
  41. that.setData({
  42. goodsId: options.goodsId,
  43. sourceUuid: options.sourceUuid ? options.sourceUuid : "",//客户经理开团会带有sourceUuid
  44. })
  45. }
  46. },