• 修复微信小程序不能获取头像和昵称的bug,微信小程序新版头像昵称API使用


    导读:

    大厂程序员都是有KPI绩效考核的,所以他们不能闲着,每天要想着怎么优化程序代码、怎么满足奇葩用户的需求,所以苦逼了我们这些小公司程序员,微信一个小小的API接口改动,可能就让一个小公司因此损失惨重,甚至直接面临倒闭。鹅厂可不管你这些小公司的死活,毕竟他们又不缺用户,我们只能含泪加班改功能了。

    最近突然发现微信小程序的用户全都是灰色头像,昵称全都是叫“微信用户”,还以为服务器被黑客攻击,植入了大量的机器人账号,找半天问题才发现是微信小程序接口又改了,尼玛,一个头像和昵称改来改去,鹅厂程序员都没事干了吗,就跟这头像和昵称过不去了?

     看微信官方的说法,意思就是不让直接使用wx.getUserProfile和wx.getUserInfo接口获取用户信息了,需要用户自已设置头像和昵称,然后你才可以使用。

    解决方案:

    一、参考微信官方推荐的头像昵称填写 | 微信开放文档,效果如下图:

     1、点击头像,可以选择微信当前的头像,也可以自己上传其他图片作为头像;

    2、点击昵称输入框,可以直接输入昵称,也可以选择微信当前的昵称

     

    小程序头像和昵称填写窗口代码:

    我这个是直接封装成一个弹窗组件的,大家可以参考一下,后端代码要自己写。

    后端需要实现以下接口:

    • 头像图片上传

    • 保存头像和昵称到数据库里

    1、index.wxml

    1. <i-modal bind:cancel="close" scrollUp="{{false}}" visible="{{showpop}}">
    2. <view class="mask">view>
    3. <view class="container">
    4. <image class="bg" mode="widthFix" src="../../images/bg.png">image>
    5. <view class='text'>
    6. <view class="title">自定义头像和昵称view>
    7. <button class="none-btn" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
    8. <image class="avatar" src="{{avatarUrl}}" mode="aspectFill">image>
    9. button>
    10. <form bindsubmit="onSave">
    11. <input type="nickname" name="nickname" maxlength="20" value="{{nickname}}" placeholder="请输入昵称"/>
    12. <button form-type="submit" class="saveBtn">保存button>
    13. form>
    14. view>
    15. view>
    16. i-modal>

    2、index.wxss

    1. /* mask layout */
    2. .mask {
    3. position: absolute;
    4. top: 0;
    5. width: 100%;
    6. height: 100%;
    7. opacity:0.8;
    8. z-index: 2;
    9. }
    10. .container{
    11. width: 80%;
    12. display: flex;
    13. position: relative;
    14. flex-direction: column;
    15. justify-content: center;
    16. align-items: center;
    17. font-size: small;
    18. }
    19. .bg{
    20. position: absolute;
    21. width: 100%;
    22. height: 100%;
    23. }
    24. .text{
    25. position: absolute;
    26. text-align: center;
    27. z-index: 9999;
    28. }
    29. .title {
    30. font-size: larger;
    31. margin-bottom: 25rpx;
    32. color:#fff;
    33. font-size:36rpx;
    34. }
    35. .avatar {
    36. width: 150rpx;
    37. height: 150rpx;
    38. border: 1rpx solid #ffffff;
    39. border-radius: 50%;
    40. }
    41. input {
    42. padding:10rpx 0px;
    43. margin-bottom:30rpx;
    44. width: 300rpx;
    45. border: 1rpx solid #333;
    46. text-align: center;
    47. }
    48. .saveBtn {
    49. text-align: center;
    50. border-radius: 10rpx;
    51. color:#fff;
    52. background: #F75451;
    53. }
    54. /*透明按钮*/
    55. .none-btn {
    56. border: none;
    57. background: none;
    58. outline: none;
    59. border-style: none;
    60. margin: 0;
    61. padding: 0;
    62. }
    63. .none-btn::after{
    64. border: none;
    65. }

    3、index.js

    1. var app = getApp();
    2. Component({
    3. properties: {
    4. showpop: {
    5. type: Boolean,
    6. value: false
    7. },
    8. avatarUrl: {
    9. type: String,
    10. value: ''
    11. },
    12. nickname: {
    13. type: String,
    14. value: ''
    15. }
    16. },
    17. attached: function () {
    18. },
    19. data: {
    20. },
    21. methods: {
    22. close: function () {
    23. this.triggerEvent("cancel");
    24. },
    25. /**
    26. * 更改头像
    27. */
    28. onChooseAvatar(e) {
    29. var that = this;
    30. const { avatarUrl } = e.detail
    31. that.setData({
    32. avatarUrl,
    33. })
    34. wx.showLoading({
    35. title: '上传头像到服务器',
    36. })
    37. wx.uploadFile({
    38. url: "后端上传图片的接口地址",
    39. filePath: avatarUrl,
    40. name: 'upfile',
    41. formData: {
    42. 'name': avatarUrl
    43. },
    44. header: {
    45. 'content-type': 'multipart/form-data'
    46. },
    47. success: function (res) {
    48. wx.hideLoading();
    49. var data = JSON.parse(res.data);
    50. //后端返回图片的访问链接
    51. const { imageUrl } = data;
    52. //保存头像图片远程服务器路径
    53. that.setData({
    54. avatarUrl:imageUrl,
    55. })
    56. }
    57. })
    58. },
    59. onSave(e){
    60. var that = this;
    61. let nickname = e.detail.value.nickname.trim()
    62. if(nickname==null || nickname==""){
    63. wx.showToast({
    64. title:"昵称不能为空",
    65. icon: 'error',
    66. duration: 2000
    67. })
    68. return;
    69. }
    70. that.setData({
    71. nickname,
    72. })
    73. console.log("头像:"+that.data.avatarUrl);
    74. console.log("昵称:"+that.data.nickname);
    75. //保存头像和昵称到数据库中
    76. app.util.request({
    77. url: 'entry/wxapp/user',
    78. data: {
    79. controller: '后端保存头像和昵称的接口地址',
    80. nickName: that.data.nickname,
    81. avatarUrl: that.data.avatarUrl
    82. },
    83. dataType: 'json',
    84. success: function(res) {
    85. if(res.data.code==0) {
    86. that.setData({
    87. showpop : false
    88. })
    89. wx.showToast({
    90. title: "保存成功",
    91. icon: "success",
    92. duration: 2000
    93. });
    94. }
    95. }
    96. })
    97. }
    98. }
    99. });

    最后分享一下我的demo示例,弹窗框组件也包含在里面了,自己参考:

    https://download.csdn.net/download/qq15577969/87096658

  • 相关阅读:
    力扣刷题记录(Java)(四)
    关于Linux系统之VM安装配置(每一个步骤都超级详细的哦!)
    MyBatis的基本操作
    Go语言之return语句深入理解及defer、return的执行顺序
    Unity拓展编辑器 一键导出图集工具
    HTTP 响应头 X-Frame-Options
    计算机毕业设计Java安全管理系统(源码+系统+mysql数据库+lw文档)
    安装Centos7
    Java8实战-总结24
    【区块链】usdt充值 离线签名 离线生成地址
  • 原文地址:https://blog.csdn.net/qq15577969/article/details/127950479