为了优化用户体验,微信小程序不再支持直接弹出授权框,可以将 button 组件open-type的值设置为getUserInfo ,当用户点击之后,可以通过bindgetuserinfo事件回调获取到用户的基本信息。
//authorize.wxml <button open-type="getUserInfo" bindgetuserinfo="getUserInfo">授权用户信息</button> //authorize.js getUserInfo(e) { //存在e.detail.rawData,表明授权面板用户点击了允许;否则表明用户点击了拒绝; if (e.detail.rawData) { ... } }需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。
获取微信用户绑定的手机号,需先调用wx.login接口(不建议在bindgetphonenumber事件回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,可能会导致解密失败)。
目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。
//authorize.wxml <button open-type="getPhoneNumber" bingtap="login" bindgetphonenumber="getPhoneNumber">授权用户手机号</button> //authorize.js //点击按钮触发bingtap,调用wx.login()获取code;同时系统会弹出授权面板 login(){ wx.login({ success: (res)=>{ _this.setData({ code: res.code }) } }) } // 点击授权面板的允许/拒绝后触发bindgetphonenumber,此时携带code肯定是新鲜的,不会过期 getPhoneNumber(e) { //存在e.detail.encryptedData,表明授权面板用户点击了允许;否则表明用户点击了拒绝; if (e.detail.encryptedData) { //调用后端接口,传入code、encryptedData、iv获取用户解密的手机号 ... } }调用前需在小程序微信公众平台 -功能-微信支付入口申请接入微信支付。
//调用后端接口 wxPay({}).then((data)=>{ if(data){ //调用微信支付API const prepayId = `prepay_id=${data.prepayId}`; wx.requestPayment({ timeStamp: data.timeStamp, //时间戳 nonceStr: data.nonceStr, //随机字符串 package: prepayId, //统一下单接口返回的 prepay_id 参数值,需拼接固定格式 signType: data.signType, //签名算法 paySign: data.paySign, //签名 success (res) { wx.navigateTo({ url: '../success/success' }) }, fail (err) { showToast(err); } }) } })微信小程序没有提现相关的API,一般用企业付款到零钱实现。
企业付款到零钱功能是微信支付的功能,需要后端去调用微信支付的功能;小程序只需要去调用后端的接口即可。
latitude和longitude是数值类型,不能是字符串类型。
handleNav(item){ //使用微信内置地图查看位置 wx.openLocation({ latitude:parseFloat(item.lat),//地址的纬度 longitude: parseFloat(item.lon),//地址的经度- address: item.deliveryAddress//详细地址 }) }