微信小程序button组件 open-type="getUserInfo"点击无响应

代码部分:<button open-type="getUserInfo" class="p_icon deter"  bindgetuserinfo="getUserInfo" hover-class="btn-red">

<view class='p_text'>确定</view>

</button>

getUserInfo: function (e) {

let that=this;

let appget = e.detail;

console.log(appget)

1.先确认button的绑定事件有没有生效,没有生效的情况下,问题有几点导致:

     a.页面代码错误,这个时候就要仔细阅读官方文档,或者查看官方demo

     b.页面绑定的方法内部逻辑是否出错,可以仔细用控制台和debuger检查

     c.在一个小程序内如果有很多个button 获取用户信息的组件,也会出现点击无响应的bug,目前不清楚是什么原因,如果有人发       现,请在评论下方留言

这里贴一下我写的前端代码:

微信小程序button组件 open-type="getUserInfo"点击无响应

2.在确认button的绑定事件生效的情况下,那就要查看在向服务器端传递参数时有没有遗漏,或者编码错误。在服务端确认已经接=收到加密的微信用户后。

3.服务端接收到加密的微信用户信息后,用微信小程序提供的SDK进行解密(SDK小程序官网自行下载,用详细接入文档)。解密完成后获得可以用来保存到数据库的数组,检查字段和表字段的格式是否一致,字符长度等等;

这里是我写服务端的接口代码:

微信小程序button组件 open-type="getUserInfo"点击无响应

微信小程序button组件 open-type="getUserInfo"点击无响应

4.在保存的数据库的过程,有一个比较隐秘的问题,插一句->我这里是mysql数据库。微信用户昵称现在丰富多样,一些个性的名称中经常包含有特殊字符,以及emoji表情。一开始我以为纯文本格式完整保存微信用户昵称(emoji表情),看了很多文章才发现,文本和表情的编码不一样:

以下为解决方法:

a.unicode定义的emoji是四个字符,softbank为3个字符,

emoji的四个字符从存储到展示对应没有做过考虑的系统来说,简直就是灾难。unicode emoji是4个字节,softbank定义的emoji占用3个字节存储,通过emoji for php ,我们可以把unicode的emoji方式转换为softbank方式,从而实现不修改数据库,就能存储emoji,相对于数据库层面的解决问题的方式,动作要小的多,并且也不会有性能,运维等方面的问题。但是有个不可避免的问题是,Softbank方式已经不再维护,所以新增加的emoji表情,Softbank中都没有,会造成部分emoji表情丢失的情况,对于这种情况不推荐使用。

 

b.使用utf8mb4字符集

  如果你的mysql版本>=5.5.3,你可以尝试直接将utf8直接升级为utf8mb4字符集
  这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,是较好的解决方案之一。
  至于字节增大带来的性能损耗,根据自己的项目,自己估算吧....

     MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,       utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。        当然,为了节省空间,一般情况下使用utf8也就够了。想了解更多,请前往http://blog.xieyc.com/utf8-and-utf8mb4/

 

c.使用base64编码

  如果你因为某些原因无法使用utf8mb4字符集的话,你还可以使用base64来曲线救国
  使用例如base64_encode之类的函数编码过后的emoji可以直接存储在utf8字节集的数据表中,取出时decode一下即可

D.针对unicode定义的emoji表情过滤

  ①.unicode定义的emoji是四个字符,根据这个原理进行过滤

 

function FilterEmoji($data)
{
    $data = preg_replace_callback(
            '/./u',
            function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];},
            $data
            );
     return $data;
 }