- wx.getLocation 接口申请不给通过?
公司业务需求要用户填写收获地址或者寄货地址,这边调用地图,用到了wx.getLocation接口获取用户当前的位置,但一直不给通过 [图片][图片]
2023-02-27 - 在function中调用this.setData不能修改?
[图片][图片]
2020-05-09 - 提示登录用户不是该小程序开发者是什么原因?
但是我用的是同一个微信开通申请的公众号哪里拿的appid呀 [图片]
2022-01-27 - 安卓 链接打印机wx.writeBLECharacteristicValue返回成功打印机没反应?
安卓机通过小程序链接蓝牙打印接,wx.writeBLECharacteristicValue返回成功,但是打印机没反应,查看手机上的蓝牙设置,显示已经连接成功,但是无法打印,打印机为365小票打印云 [图片]
2021-07-07 - wx.openLocation 使用微信内置地图跳转地图app能设置起点么?
wx.openLocation 跳转地图app只可设置终点,如何能把起点也一起传过去?
2021-03-09 - 为何wx.chooseLocation获取的经纬度用于wx.openLocation中定位相差很大?
//获取经纬度代码 wx.chooseLocation({ success: (res) => { this.setData({ "location.longitude": res.longitude, "location.latitude": res.latitude, "location.address": res.address, "location.addrName": res.name }); } }); //打开地图 let location = this.data.location; wx.openLocation({ latitude: location.latitude, longitude: location.longitude, name: location.addrName, address: location.address, success: res => { console.log(res) } }) 代码有什么问题吗?
2021-03-28 - 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
老规矩,先看效果图 可以在地图上显示店铺位置,地址,联系方式 [图片] 点击位置可以调起导航功能 [图片] 第一步,获取经纬度 因为小程序内置的是腾讯地图,所以你需要到腾讯地图上查询经纬度。 首先,你要明确一个事情,任何位置都有它的 经纬度 ,所以你首先要获取到你想定位位置的经纬度。 腾讯地图经纬度查询:https://lbs.qq.com/tool/getpoint/index.html [图片] 如我这里的经纬度:30.353351,120.231010 要记住纬度在前,经度在后。所以我这里的纬度是30.353351,经度是120.231010 第二步,设置wxml页面 我先把代码截个图出来。 [图片] 然后把代码贴出来给到大家 [代码]<map style="width:100%; height:700rpx;" longitude="{{longitude}}" latitude="{{latitude}}" scale="17" markers="{{markers}}" bindmarkertap="navRoad" data-marker="{{markers[0]}}" show-location /> <view class="phone" bindtap="Call"> 地址:杭州市丁兰广场C座 </view> <view class="phone" bindtap="Call"> 电话:2501902696(可点击拨打) </view> [代码] 这里我们用到了小程序的map组件来显示地图,可以直接设置经纬度和标记点。 [图片] 第三步,编写js代码 我先把代码截图贴出来给到大家 [图片] 然后把代码给到大家 [代码]Page({ data: { //店铺经纬度 latitude: 30.353351, longitude: 120.231010, //标记点 markers: [{ id: 0, name: "编程小石头", address: "杭州市丁兰广场C座", latitude: 30.353351, longitude: 120.231010, width: 50, height: 50 }] }, //拨打电话 Call() { wx.makePhoneCall({ phoneNumber: '2501902696' }) }, //导航 navRoad(event) { console.log(event) wx.getLocation({ //获取当前经纬度 type: 'wgs84', //返回可以用于wx.openLocation的经纬度, success: function (res) { wx.openLocation({ //使用微信内置地图查看位置。 latitude: event.currentTarget.dataset.marker.latitude, //要去的纬度-地址 longitude: event.currentTarget.dataset.marker.longitude, //要去的经度-地址 name: event.currentTarget.dataset.marker.name, address: event.currentTarget.dataset.marker.address }) } }) } }) [代码] 这里其实就点击导航事件比较麻烦些,其他的都还好。注释里给大家标的很清楚了。 第四步,设置定位权限 到这里其实代码已经完成了,但是我们导航的时候需要用到用户的位置权限,所以我们要在app.json里设置用户授权 [图片] 如果不设置,点击导航会有如下提示。 [图片] 所以我们要在app.json里设置 [图片] [代码] "permission": { "scope.userLocation": { "desc": "导航需要" } }, [代码] 到这里我们就可以很方便的让用户找到我们了。
2021-03-14 - 小程序里使用async和await变异步为同步,解决回调地狱问题
最近好多同学,学习完石头哥的云开发基础以后,自己实际项目中,总会遇到各种各样的异步问题。 一,异步问题 所谓异步:就是我们请求数据库的数据时,由于网速等各方面原因,数据返回的时间不确定,而我们要使用这些数据,就要等数据返回成功后才可以使用,否则就会报错。 1-1,问题描述 如下: [图片] 好多同学都会认为代码从上往下执行,会先执行请求成功,然后才会执行第11行的代码,商品个数也应该是2. 但是我们的第11行打印却是0.这是为什么呢。 这个错误的原因就是我们使用数据没有写在请求成功里面。正确数据请求返回是异步的,什么时候请求成功不知道,但是我们的第11行代码不会等我们数据请求成功才会执行,所以第11行的打印是0而不是2. 1-2,解决方案 要想解决上面的问题,把你使用数据的地方写到数据请求成功里。 [图片] 这样就能解决异步的问题,但是如果我们有很多地方要使用请求成功的数据,该怎么办呢,总不能把所有的代码都写在数据请求成功里吧。这个时候就要借助async和await来解决这个问题了。 二,使用async和await变异步为同步 所谓的同步,就是我们保持代码正常的从上往下执行。但是呢只要有数据请求,就会有异步问题。所以我们这里要想办法变异步为同步。这就要用到async和await了。 代码如下: [图片] 可以看出,我们不用把使用到数据的代码写到请求成功里就可以了,这样代码读起来是不是常规的从上往下执行的了。 await翻译过来就是等待的意思,其实这里的意思就是,我们等待数据请求完成后,把数据的返回结果赋值给res,然后等数据请求成功以后,就可以正常使用数据请求返回的结果啦。 注意事项 我们在小程序里使用async和await时,一定是成对的。 async放在函数名前面,await放在数据请求前面。 [图片] 并且也要勾选一下:增强编译 [图片] 现在最新版本的小程序开发者工具好像已经支持async和await方法了,好像不勾选增强编译也没事。但是安全起见,还是勾选下增强编译比较好。 三,回调地狱 比如我们有这么一个需求: 用户注册的时候,要先查询是否注册过,没有注册过,才可以新注册。而注册成功后,才可以查看商品列表。 3-1,问题描述 这里给大家分析下需求 [图片] 如果只看流程图,肯定会觉得很简单;但是里面的链路你要认清一个现实。 就是我们如果想最终把商品显示到页面上,必须依赖每个流程都要请求成功。现在是只有3个请求,如果有100个呢,一层套一层的,最后会把你绕晕。这就是回调地狱。 3-2,回调地狱代码 单纯的给你讲,你可能体会不到回调地狱的坏处。那么我用代码实现下我们上面的需求。 假设我们有 用户表:user 商品表:goods 比如我们要注册一个名为”小石头“的用户 第一步:先查询是否注册过 [图片] 可以看出返回的个数为0,代表没有注册过 第二步:注册用户 [图片] 可以看到我们已经可以注册成功了,但是这个时候代码已经嵌套了。 [图片] 第三步:查询商品 由于我们第二步,已经注册’小石头‘成功,所以我们这一步注册一个’大石头‘,注册成功后查询商品。 首先看下代码,这个时候已经嵌套3层了。代码已经变得有点乱了 [图片] 看下结果 [图片] 可以看出我们已经能够成功的查询到商品数据了。 这里只嵌套了三层,看起来还可以接受,如果再继续一层层的嵌套呢。后面代码会变得越来越乱,为了避免回调地狱,我们也可以使用async和await来改造代码。 四,async结合await解决回调地狱 首先看下改造后的代码 [图片] 可以看到代码简洁了很多,逻辑也就是正常的从上往下执行代码 为了更明显的比较。 [图片] 到这里我们就讲完了,是不是感觉使用async和await让你的代码简洁了很多。赶紧跟着石头哥的这篇文章去体验下吧。
2021-05-29 - 小程序 卖家能收到消息提醒吗? 如 您有一笔新订单,请及时处理。
小程序 卖家能收到消息提醒吗 如 您有一笔新订单,请及时处理。
2021-07-22 - 请问下小程序如何实现语音播报的功能?类似于收款后语音播报,是否需要和公众号配合实现?
hi, 如题,求大佬指教!!
2020-09-18 - 小程序如何实现语音播报的功能?类似于收款后语音播报
小程序如何实现语音播报的功能?类似于收款后语音播报
2021-03-05 - JSAPI支付在安卓端提示缺少total_fee
[图片] 在ios端JSAPI可以支付成功,而在安卓端就如图显示,请问各位大佬有遇到过这个情况吗?要怎么解决?
2021-03-04 - 使用prepay_id即时发送模板消息大概率提示form_id不正确,或者过期
由于小程序后台和微信支付后台是不同的存储模块,当一个微信支付的 form_id 生成以后,同步到小程序的模板发送后台,是需要时间的,这里可能会延迟几秒钟的时间。这里就是出现"invalid form id"的原因了。所以只要开发者延迟 5-10 秒来处理信息即可解决。
2019-08-28 - 云支付返回结果中没有noncestr和正确的prepay_id
请求:[图片] 返回结果是 : [图片]请问下是什么原因导致的呢? 权限配置 [图片]
2020-07-22 - 云开发微信支付配置添加商户号后,绑定状态为“待模板消息确认”如何处理?
近期发现不少同学不知道如何确认云开发微信支付的授权,这里写一下解决方法: 云开发微信支付配置商户号方式:在云控制台 -> 设置 -> 全局设置->添加商户号->输入要绑定的商户号 [图片] 添加商户号后要进行商户号绑定确认,在全局设置界面显示待模板消息确认后,这时绑定了微信支付的商户号“超级管理员的微信”会收到一条授权确认的模板消息,点击模板消息会弹出服务商助手小程序,确认授权之后就可以在云开发控制台看到绑定状态为“已绑定”,而 JS API 权限也会显示“已授权”。(此项步骤需要关注过“微信支付商家助手”公众号),如未关注“微信支付商家助手”公众号,可以看下面方法进行手动绑定,退款权限下同。 jsapi 和 api 退款权限授权:登录微信支付商户平台-产品中心-我的授权产品中进行确认授权完成授权后才可以调用微信支付相关接口能力。如果你在你的产品中心看不到我的授权产品,可以点击链接:授权产品 [图片]
2021-01-14 - 服务端调用CloudPay.unifiedOrder(),返回"受理关系不存在",请问如何解决?
今天看到云开发支付有新文档,迫不及待的试了一下,支付二维码也出来了,不过一细看,有问题的。 代码用的官方文档下面的示例,不过我按文档的要求把一些必填参考填写了下,还是不行,返回"受理关系不存在"。 errMsg: "cloud.callFunction:ok" requestID: "00223ddd-94e9-11ea-8f79-525400149ac0" result: errCode: 0 errMsg: "cloudPay.unifiedOrder:ok" payment: {timeStamp: "1589353904", nonceStr: "", package: "prepay_id=", signType: "MD5", paySign: "467EBDC447***********3F37"} returnCode: "FAIL" returnMsg: "受理关系不存在"
2020-05-13 - 小程序无法获取手机号,提示“该appid没有权限”
目前获取手机号接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。具体可参考文档说明:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 若是调用该接口出现提示“该 appid 没有权限”,请确认该小程序是否符合使用条件。
2020-02-25 - 使用云函数+云调用,四步实现微信支付
微信支付是云开发原生支持的微信生态能力之一,开发者只需要简单调用相应的函数即可完成整套支付流程,安全又高效。部分优势包括: 无需关心证书、签名,支付流程简化;基于微信私有协议和私有链路,更加安全、高效;免运维,高可用性;按需扩容,弹性伸缩,按量计费,成本缩减;支持通过云函数接受支付回调,无需自建回调服务。流程对比:传统流程 vs 云开发[图片] 代码示例第 1 步:小程序调用云函数C 端用户发起支付流程后,小程序端调用云函数(此处假设云函数名为 [代码]makeOrder[代码]): // 小程序代码 wx.cloud.callFunction({ name: "makeOrder", data: { /* 开发者自定义参数 */ } }); 第 2 步:云函数生成订单,返回订单信息云函数 makeOrder 收到调用之后,使用微信服务端 SDK 提供的 API,无需证书和签名,可直接生成订单。 生成订单之后,利用 CloudPay.unifiedOrder() 统一下单接口,将订单信息返回给小程序。 CloudPay.unifiedOrder() 接口文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html // 云函数 makeOrder const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); exports.main = async (event, context) => { const res = await cloud.cloudPay.unifiedOrder({ body: "小秋TIT店-超市", outTradeNo: "1217752501201407033233368018", spbillCreateIp: "127.0.0.1", subMchId: "1900009231", totalFee: 1, envId: "test-f0b102", functionName: "payCallback" // 支付回调的函数名 }); return res; }; 第 3 步:小程序端发起支付小程序端收到云函数返回的订单信息后,发起支付: // 小程序代码 wx.cloud.callFunction({ name: "makeOrder", data: { /* 开发者自定义参数 */ }, success: (res) => { // 取得云函数返回的订单信息 const payment = res.result.payment; // 调起微信客户端支付 wx.requestPayment({ ...payment, success(res) { /* 成功回调 */ }, fail(res) { /* 失败回调 */ } }); } }); 第 4 步:使用云函数接收支付回调,完成支付流程用户完成付款之后,微信后台将会调用指定的云函数(此处假设名为 payCallback),传入的参数中会带有订单信息。 开发者可以在此云函数中,实现自己的发货、完成订单的逻辑。 // 云函数 payCallback exports.main = async (event, context) => { const { return_code, // 状态码 appid, // 小程序 AppID mch_id, // 微信支付的商户号 device_info, // 微信支付分配的终端设备号 openid, // 用户在商户appid下的唯一标识 trade_type, // 交易类型:JSAPI、NATIVE、APP bank_type // 银行类型 // ...... // 更多参数请参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8 } = event; /* 开发者自己的逻辑 */ // 向微信后台返回成功,否则微信后台将会重复调用此函数 return { errcode: 0 }; }; 相关文档:云函数文档: https://docs.cloudbase.net/cloud-function/introduce.html 云调用文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html wx-server-sdk 文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/Cloud.html CloudPay.unifiedOrder() 接口文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html
2021-07-08 - 云开发,onload函数 页面加载时查询云数据 异步问题?
各位大佬新年好,我遇到如下问题,小程序云开发,页面加载时先查询云数据库数据,根据数据情况设置页面参数,现在不知道是不是异步问题,设置不了页面参数。 我的页面onload 函数如下: data: { allInfo: [], sakliwahinimStat:false, //保存内容是否存在 saklaptima:'none', //表示已经保存了 saklimaptima:'block', //表示没保存 shoucangAsarId:'' //当前页商品id }, onLoad: function (options) { let that=this //获取asarid that.setData({shoucangAsarId:options.id}) //根据options.id 查收藏状态 that.shiFouShouCang(options.id) if(that.data.sakliwahinimStat==true){ that.setData({ saklaptima:'block', saklimaptima:'none' }) }else{ that.setData({ saklaptima:'none', saklimaptima:'block' }) } 云数据库判断函数: shiFouShouCang(asarId){ //判断是否收藏,根据状态制定图标状态 db.collection('sakliwahanlirim').where({ asarId:asarId }).count().then(res=>{ if(res.total>0){ that.setData({sakliwahinimStat:true}) } else{ that.setData({sakliwahinimStat:false}) } }) }, 我的想法是先从数据库里查询数据,然后设置页面状态,我这样有问题吗,帮我看看,谢谢
2021-02-14 - 登录接口又双叕变了,三行代码挑战全网最少修改工作量
小程序登录、用户信息样关接口又双叕变了。 https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801 几家悲伤几家愁。。。 微信的一小步,人猿的一大步。。。 没办法,改吧。。。 翻出以前小程序这部分的代码,惊喜地发现,只需要三行代码,就能平滑过渡; 感谢我以前看似丑陋却很省事的登录代码逻辑!!! 登录逻辑如下: 1、判断库里有用户的信息没有,没有,则wx.navigateTo一个专门的授权页面:auth 2、授权成功后获得userInfo,保存到库里; auth页代码修改如下: auth.wxml: 修改一行代码 <button style='margin:15px;font-size:16px' type='primary' size="mini" bindtap='getUserProfile'>授权微信头像和昵称</button> auth.js: 修改两行代码 //原wx.getUserInfo接口 getUserInfo: function (e) { let userInfo = e.detail.userInfo if (userInfo) this.onSaveUserInfo(userInfo) }, //新增wx.getUserProfile接口 getUserProfile: function (e) { wx.getUserProfile({ desc: '业务需要', success: res => this.onSaveUserInfo(res.userInfo) }) }, //保存userInfo到DB onSaveUserInfo:function(userInfo){ console.log(app.globalData.userInfo = userInfo) db.collection('user') .where({ _id: this.openid }) .count() .then(res => { if (res.total > 0) { //doc.update db.collection('user').doc(this.openid).update({ data: userInfo }).then(res => console.log(res)) } else { //doc.add db.collection('user').doc(this.openid).add({ data: userInfo }).then(res => console.log(res)) } }) wx.navigateBack() }, 以下是判断用户信息是否存在的代码: xxxx.js: onSubmit:async function () { if (await app.hasUserInfo()) { } else return //其他代码 }, app.js: hasUserInfo: async function () { if (this.globalData.userInfo && this.globalData.userInfo.nickName && this.globalData.userInfo.avatarUrl) return true let res = await wx.cloud.database().collection('user').doc(this.openid).get().catch(err => console.log(err)) if (res && res.data && res.data.nickName && res.data.avatarUrl) { this.globalData.userInfo = res.data return true } else { wx.navigateTo({ url: '/base/auth/auth' }) return false } }, 关于用户信息自动更新: 我们一直以来的方法如下: 1、留给用户手动授权的入口,用户更换头像后,发现自己的头像不显示,则需要手动授权刷新userInfo; 2、一般会在这个页面:我的--个人信息--授权微信头像和昵称,用户点击后,wx.navigateTo到授权页。 笔者团队认为:用户信息自动更新其实是个伪需求。理由如下: 假设某用户修改了头像: 1、用户自己打开小程序,发现头像和昵称怎么没有改过来,那么手动更新一下。用户体验没毛病,没必要非要自动更新; 2、用户如果后来不再进入小程序,别人看到的都是一张碎的头像,那么此时,自动更新也毫无作用,因为该用户都不打开小程序。 3、微信团队肯定考虑过自动更新这种要求,但他们宁愿千夫所指,也依然坚持推出新的登录接口,那就肯定是已经经过了中国最牛逼团队的全面考衡了。 补充: 登录和授权其实是两码事,可以毫无关系这么说,以上的内容主要都是关于授权微信用户信息的,下面补充一下登录的内容: 登录其实就是获取用户的openid,我们一直采用云函数来获取openid。方案如下: 在每个页面:page.js: onLoad: async function (options) { this.openid = await app.getOpenid() }, 在app.js: getOpenid: async function () { if (this.openid) return this.openid let res = await this.globalData.cloud.callFunction({ name: 'login' }) console.log(res) return this.openid = res.result.FROM_OPENID||res.result.OPENID },
2021-04-07 - 字符串比较的问题
怎么判断字符串A是否包含字符串B? 新手请教了 只需要JS代码就行
2018-06-06 - 微信小程序:data里的数组赋值给变量,修改变量,data数组值也会改变
问题:newArray执行了倒叙后执行正常,但是data里的array也倒叙了 data:{ array:[ {id:0},{id:1} ] } ----------------------- var newArray = this.data.array //倒叙数组 newArray.reverse() console.log(newArray); console.log(this.data.array) //执行结果 [{id:1},{id:0}]//newArray [{id:1},{id:0}]//this.data.array ------------------------------ 解决方案:查阅相关资料后,发现这样的赋值并不是真的赋值,而是传递的性质,所以需要将数组array转换json字符串后,才算是赋值 ------------------------------ var newArray = JSON.parse(JSON.stringify(this.data.array)); newArray.reverse() console.log(newArray); console.log(this.data.array) //执行结果 [{id:1},{id:0}]//newArray [{id:0},{id:1}]//this.data.array ------------------------------ 【注意】这种问题只会出现在你的数组类型是键值对的情况
2020-07-14 - Key值不带引号的对象字符串该如何转为对象或数组?
[{ name : '学生:' , code: '[12345678]林XX' }] 这是一段字符串我需要把它转为数组或者字符串方便拿到里面的数据 用了JSON.parse会报错 原因是因为这一段的Key值没有引号,不规范 小程序也不支持eval() 那么我该如何转为对象呢? [图片]
2021-08-25 - 最近更新的小程序版本canvas得到的图片缩小了
预期效果:版本1.05.2106092版本尺寸正常,铺满屏幕 更新版本后canvas 2d绘图,生成的图片大小缩小了。 [图片]
2021-06-25 - 调用canvas的drawImage之后,在canvas显示的图片,没有显示完全?
[图片] [图片] 右面是drawImage之后的效果,图片没有在canvas上完全显示。
2020-06-04 - 为何security.imgSecCheck云函数调用一直返回msgR:false?
借鉴了网上的各种方案,都是同样的结果: [图片] 云函数如下: exports.main = async (event, context) => { const fileID = event.fileID const res = await cloud.downloadFile({ fileID: fileID, }) const buffer = res.fileContent try { var result = await cloud.openapi.security.imgSecCheck({ media: { contentType: 'image/png', value: buffer } }); return result } catch (err) { return err } }
2021-03-13 - 云服务器调用security.imgSecCheck完成代码分享
云服务器代码: // 云函数入口文件 const cloud = require(‘wx-server-sdk’) cloud.init() // 云函数入口函数 exports.main = async (event, context) => { const {value} = event; try { const res = await cloud.openapi.security.imgSecCheck({ media: { header: {‘Content-Type’: ‘application/octet-stream’}, contentType: ‘image/png’, value:Buffer.from(value) } }) return res; } catch (err) { return err; } } 本地函数: wx.chooseImage({count: 1}).then((res) => { if(!res.tempFilePaths[0]){ return; } console.log(JSON.stringify(res)) if (res.tempFiles[0] && res.tempFiles[0].size > 1024 * 1024) { wx.showToast({ title: ‘图片不能大于1M’, icon: ‘none’ }) return; } wx.getFileSystemManager().readFile({ filePath: res.tempFilePaths[0], success: buffer => { console.log(buffer.data) wx.cloud.callFunction({ name: ‘checkImg’, data: { value: buffer.data } }).then( imgRes => { console.log(JSON.stringify(imgRes)) if(imgRes.result.errorCode == ‘87014’){ wx.showToast({ title:‘图片含有违法违规内容’, icon:‘none’ }) return }else{ //图片正常 } [代码] } ) }, fail: err => { console.log(err) } } ) 我相信做出来的人很多,但是没有分享出来,我今天分享出来就是为了避免更多程序员不要在这种简单的问题上,浪费太多的时间,我就浪费了很多时间,兼职太坑爹了[代码]
2019-07-26