前言

本教程是基于 “apifm-wxapi” 模块,教你快速实现小程序开发,所以你可能需要先了解以下知识点:

《创建 HelloWorld 项目》
《使用 “apifm-wxapi” 快速开发小程序》
《免费注册开通后台,获得专属域名》

本案例中,部分功能,需要用户登录后才能操作,也就是说需要 token 授权,请先了解:

《微信小程序登录获取openid及三方token》

功能介绍

本例带大家小程序快速实现以下5个功能:

  1. 读取当前登录用户的用户资料: 基础信息、扩展信息、实名信息等;
  2. 读取当前登录用户的 openid、unionid;
  3. 修改用户资料:所在省市、昵称、头像、扩展属性;
  4. 实名认证:填写正确的姓名、身份证号码进行快速认证;
  5. 退出登录

启用模块

登录 “第一步” 注册的后台,左侧菜单 —> 工厂设置 —> 模块管理

找到并启用下述模块:

  1. 实名认证

实名认证需要通过公安接口进行校验姓名和身份证号码是否匹配,所以务必要先启用模块,否则会提示模块未开启

实名认证接口为收费接口,你需要在启用模块的地方充值接口调用次数后方可使用实名认证功能

apifm-wxapi 方法说明

获取用户信息

  1. WXAPI.userDetail(token)

base 数据存放了用户的基础信息; idcard 数据存放了用户的实名认证信息[如果用户有通过实名认证的话] ext 数据存放了用户的扩展属性

获取用户id、openid、unionid

  1. WXAPI.userWxinfo(token)

获取当前登录用户的用户id、openid、unionid

修改用户资料

  1. WXAPI.modifyUserInfo(Object object)

实名认证

  1. WXAPI.idcardCheck(token, name, idCardNo)

身份证实名认证方法,校验姓名和身份证号码是否匹配 name 为真实姓名;idCardNo 为身份证号码

退出登录

  1. WXAPI.loginout(token)

退出后,当前token将立刻失效

小程序开发

效果截图

用户信息/实名认证 - 图1

用户信息/实名认证 - 图2

用户信息/实名认证 - 图3

小程序代码

读取用户资料 / 修改资料

  1. <view class="page">
  2. <view class="page__bd">
  3. <form bindsubmit="bindSave" report-submit="true">
  4. <view class="weui-cells weui-cells_after-title">
  5. <view class="weui-cell">
  6. <view class="weui-cell__hd">
  7. <view class="weui-label">省份</view>
  8. </view>
  9. <view class="weui-cell__bd">
  10. <input name="province" value="{{ userInfo.base.province }}" class="weui-input" placeholder="请输入所在省份" />
  11. </view>
  12. </view>
  13. <view class="weui-cell">
  14. <view class="weui-cell__hd">
  15. <view class="weui-label">城市</view>
  16. </view>
  17. <view class="weui-cell__bd">
  18. <input name="city" value="{{ userInfo.base.city }}" class="weui-input" placeholder="请输入所在城市" />
  19. </view>
  20. </view>
  21. <view class="weui-cell">
  22. <view class="weui-cell__hd">
  23. <view class="weui-label">昵称</view>
  24. </view>
  25. <view class="weui-cell__bd">
  26. <input name="nick" value="{{ userInfo.base.nick }}" class="weui-input" placeholder="请输入你的昵称" />
  27. </view>
  28. </view>
  29. </view>
  30. <view class="weui-cells__tips">思考题: 尝试实现上传(更换)头像</view>
  31. <view class="weui-cells weui-cells_after-title">
  32. <view class="weui-cell">
  33. <view class="weui-cell__hd">
  34. <view class="weui-label">学校</view>
  35. </view>
  36. <view class="weui-cell__bd">
  37. <input name="school" value="{{ userInfo.ext['学校'] }}" class="weui-input" placeholder="请输入你就读的大学" />
  38. </view>
  39. </view>
  40. <view class="weui-cell">
  41. <view class="weui-cell__hd">
  42. <view class="weui-label">年龄</view>
  43. </view>
  44. <view class="weui-cell__bd">
  45. <input name="age" value="{{ userInfo.ext['年龄'] }}" class="weui-input" placeholder="请输入你的芳龄" />
  46. </view>
  47. </view>
  48. <view class="weui-cell">
  49. <view class="weui-cell__hd">
  50. <view class="weui-label">微信号</view>
  51. </view>
  52. <view class="weui-cell__bd">
  53. <input name="wx" value="{{ userInfo.ext['微信号'] }}" class="weui-input" placeholder="请输入你的微信号码" />
  54. </view>
  55. </view>
  56. </view>
  57. <view class="weui-cells__tips">以上为用户的扩展属性,要多少加多少</view>
  58. <view class="weui-btn-area">
  59. <button class="weui-btn" type="primary" formType="submit">编辑</button>
  60. </view>
  61. </form>
  62. </view>
  63. </view>
  1. const WXAPI = require('apifm-wxapi')
  2. Page({
  3. data: {
  4. userInfo: undefined
  5. },
  6. onLoad: function (options) {
  7. },
  8. onShow: function () {
  9. const loginToken = wx.getStorageSync('loginToken')
  10. if (!loginToken) {
  11. wx.showToast({
  12. title: '请先登录',
  13. icon: 'none'
  14. })
  15. this.goRegist()
  16. return
  17. }
  18. WXAPI.userDetail(loginToken.token).then(res => {
  19. console.log(res)
  20. if(res.code == 0){
  21. this.setData({
  22. userInfo: res.data
  23. })
  24. }
  25. })
  26. },
  27. goRegist() {
  28. wx.navigateTo({
  29. url: '/pages/auth/index'
  30. })
  31. },
  32. bindSave(e) {
  33. const loginToken = wx.getStorageSync('loginToken')
  34. if (!loginToken) {
  35. wx.showToast({
  36. title: '请先登录',
  37. icon: 'none'
  38. })
  39. this.goRegist()
  40. return
  41. }
  42. const province = e.detail.value.province;
  43. const city = e.detail.value.city;
  44. const nick = e.detail.value.nick;
  45. const extJsonStr = {}
  46. extJsonStr['学校'] = e.detail.value.school
  47. extJsonStr['年龄'] = e.detail.value.age
  48. extJsonStr['微信号'] = e.detail.value.wx
  49. WXAPI.modifyUserInfo({
  50. token: loginToken.token,
  51. province,
  52. city,
  53. nick,
  54. extJsonStr: JSON.stringify(extJsonStr)
  55. }).then(res => {
  56. console.log(res)
  57. if (res.code == 0) {
  58. wx.showToast({
  59. title: '修改成功',
  60. icon: 'success'
  61. })
  62. } else {
  63. wx.showToast({
  64. title: res.msg,
  65. icon: 'none'
  66. })
  67. }
  68. })
  69. },
  70. })

实名认证

  1. <view class="page">
  2. <view class="page__bd">
  3. <form bindsubmit="bindSave" report-submit="true">
  4. <view class="weui-cells weui-cells_after-title">
  5. <view class="weui-cell ">
  6. <view class="weui-cell__hd">
  7. <view class="weui-label">姓名</view>
  8. </view>
  9. <view class="weui-cell__bd">
  10. <input name="name" class="weui-input" placeholder="请输入真实姓名" />
  11. </view>
  12. </view>
  13. <view class="weui-cell ">
  14. <view class="weui-cell__hd">
  15. <view class="weui-label">身份证</view>
  16. </view>
  17. <view class="weui-cell__bd">
  18. <input name="idCardNo" class="weui-input" placeholder="请输入身份证号码" />
  19. </view>
  20. </view>
  21. </view>
  22. <view class="weui-btn-area">
  23. <button class="weui-btn" type="primary" formType="submit">实名认证</button>
  24. </view>
  25. </form>
  26. </view>
  27. </view>
  1. const WXAPI = require('apifm-wxapi')
  2. Page({
  3. data: {
  4. },
  5. onLoad: function (options) {
  6. },
  7. onShow: function () {
  8. },
  9. goRegist() {
  10. wx.navigateTo({
  11. url: '/pages/auth/index'
  12. })
  13. },
  14. bindSave(e) {
  15. const loginToken = wx.getStorageSync('loginToken')
  16. if (!loginToken) {
  17. wx.showToast({
  18. title: '请先登录',
  19. icon: 'none'
  20. })
  21. this.goRegist()
  22. return
  23. }
  24. const name = e.detail.value.name;
  25. const idCardNo = e.detail.value.idCardNo;
  26. if (!name || !idCardNo) {
  27. wx.showToast({
  28. title: '信息未填写',
  29. icon: 'none'
  30. })
  31. return
  32. }
  33. WXAPI.idcardCheck(loginToken.token, name, idCardNo).then(res => {
  34. console.log(res)
  35. if (res.code == 0) {
  36. wx.showToast({
  37. title: '认证通过',
  38. icon: 'success'
  39. })
  40. } else {
  41. wx.showToast({
  42. title: res.msg,
  43. icon: 'none'
  44. })
  45. }
  46. })
  47. },
  48. })

获取openid / unionid

  1. <button type="primary" bindtap="openid">获取openid / unionid</button>
  1. openid(){
  2. const loginToken = wx.getStorageSync('loginToken')
  3. if (!loginToken) {
  4. wx.showToast({
  5. title: '请先登录',
  6. icon: 'none'
  7. })
  8. return
  9. }
  10. WXAPI.userWxinfo(loginToken.token).then(res => {
  11. console.log(res)
  12. wx.showToast({
  13. title: '查看控制台',
  14. icon: 'success'
  15. })
  16. })
  17. }

退出登录

  1. <button type="warn" bindtap="loginout">退出</button>
  1. loginout(){
  2. const loginToken = wx.getStorageSync('loginToken')
  3. if (loginToken) {
  4. WXAPI.loginout(loginToken.token).then(res => {
  5. if (res.code == 0) {
  6. wx.showToast({
  7. title: '退出成功',
  8. icon: 'success'
  9. })
  10. wx.clearStorage()
  11. } else {
  12. wx.showToast({
  13. title: res.msg,
  14. icon: 'none'
  15. })
  16. }
  17. })
  18. } else {
  19. wx.showToast({
  20. title: '退出成功',
  21. icon: 'success'
  22. })
  23. }
  24. }

关于更加详细的参数使用,以及更加高级的进阶使用方法,可以参考api接口文档说明:

《api接口文档》

关于 apifm-wxapi 更多的使用方法:

《apifm-wxapi使用说明》

本案例Demo代码下载:

《apifm-wxapi使用Demo程序》

期待你的进步!
感谢!