获取微信信息,我这是php代码javascript
//获取微信信息 public function getSignPackage() { $appId = $this->_mp['appid']; $appSecret = $this->_mp['appsecret']; $jsapiTicket = $this->getJsApiTicket($appId,$appSecret); // 注意 URL 必定要动态获取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; }
而后前端引入jsphp
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
初始化html
<script> wx.config({ debug: false, appId: '{$appId}', timestamp: '{$timestamp}', nonceStr: '{$nonceStr}', signature: '{$signature}', jsApiList: ['previewImage','getLocation','openLocation'] });
判断当前客户端版本是否支持指定JS接口前端
wx.checkJsApi({ jsApiList: ['chooseImage'], // 须要检测的JS接口列表,全部JS接口列表见附录2, success: function(res) { // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} } });
备注:checkJsApi接口是客户端6.0.2新引入的一个预留接口,第一期开放的接口都可不使用checkJsApi来检测。java
分享接口node
请注意不要有诱导分享等违规行为,对于诱导分享行为将永久回收公众号接口权限,详细规则请查看:朋友圈管理常见问题 。ios
获取“分享到朋友圈”按钮点击状态及自定义分享内容接口git
wx.onMenuShareTimeline({ title: '', // 分享标题 link: '', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
获取“分享给朋友”按钮点击状态及自定义分享内容接口web
wx.onMenuShareAppMessage({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 若是type是music或video,则要提供数据连接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
获取“分享到QQ”按钮点击状态及自定义分享内容接口ajax
wx.onMenuShareQQ({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享连接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
wx.onMenuShareWeibo({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享连接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
获取“分享到QQ空间”按钮点击状态及自定义分享内容接口
wx.onMenuShareQZone({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享连接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
图像接口
拍照或从手机相册中选图接口
wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 能够指定是原图仍是压缩图,默认两者都有 sourceType: ['album', 'camera'], // 能够指定来源是相册仍是相机,默认两者都有 success: function (res) { var localIds = res.localIds; // 返回选定照片的本地ID列表,localId能够做为img标签的src属性显示图片 } });
预览图片接口
wx.previewImage({ current: '', // 当前显示图片的http连接 urls: [] // 须要预览的图片http连接列表 });
上传图片接口
wx.uploadImage({ localId: '', // 须要上传的图片的本地ID,由chooseImage接口得到 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var serverId = res.serverId; // 返回图片的服务器端ID } });
备注:上传图片有效期3天,可用微信多媒体接口下载图片到本身的服务器,此处得到的 serverId 即 media_id。
下载图片接口
wx.downloadImage({ serverId: '', // 须要下载的图片的服务器端ID,由uploadImage接口得到 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var localId = res.localId; // 返回图片下载后的本地ID } });
获取本地图片接口
wx.getLocalImgData({ localId: '', // 图片的localID success: function (res) { var localData = res.localData; // localData是图片的base64数据,能够用img标签显示 } });
备注:此接口仅在 iOS WKWebview 下提供,用于兼容 iOS WKWebview 不支持 localId 直接显示图片的问题。具体可参考《iOS网页开发适配指南》
音频接口
开始录音接口
wx.startRecord();
中止录音接口
wx.stopRecord({ success: function (res) { var localId = res.localId; } });
监听录音自动中止接口
wx.onVoiceRecordEnd({ // 录音时间超过一分钟没有中止的时候会执行 complete 回调 complete: function (res) { var localId = res.localId; } });
播放语音接口
wx.playVoice({ localId: '' // 须要播放的音频的本地ID,由stopRecord接口得到 });
暂停播放接口
wx.pauseVoice({ localId: '' // 须要暂停的音频的本地ID,由stopRecord接口得到 });
中止播放接口
wx.stopVoice({ localId: '' // 须要中止的音频的本地ID,由stopRecord接口得到 });
监听语音播放完毕接口
wx.onVoicePlayEnd({ success: function (res) { var localId = res.localId; // 返回音频的本地ID } });
上传语音接口
wx.uploadVoice({ localId: '', // 须要上传的音频的本地ID,由stopRecord接口得到 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var serverId = res.serverId; // 返回音频的服务器端ID } });
备注:上传语音有效期3天,可用微信多媒体接口下载语音到本身的服务器,此处得到的 serverId 即 media_id,参考文档 .目前多媒体文件下载接口的频率限制为10000次/天,如须要调高频率,请登陆微信公众平台,在开发 - 接口权限的列表中,申请提升临时上限。
下载语音接口
wx.downloadVoice({ serverId: '', // 须要下载的音频的服务器端ID,由uploadVoice接口得到 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var localId = res.localId; // 返回音频的本地ID } });
智能接口
识别音频并返回识别结果接口
wx.translateVoice({ localId: '', // 须要识别的音频的本地Id,由录音相关接口得到 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { alert(res.translateResult); // 语音识别的结果 } });
设备信息
获取网络状态接口
wx.getNetworkType({ success: function (res) { var networkType = res.networkType; // 返回网络类型2g,3g,4g,wifi } });
地理位置
使用微信内置地图查看位置接口
wx.openLocation({ latitude: 0, // 纬度,浮点数,范围为90 ~ -90 longitude: 0, // 经度,浮点数,范围为180 ~ -180。 name: '', // 位置名 address: '', // 地址详情说明 scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大 infoUrl: '' // 在查看位置界面底部显示的超连接,可点击跳转 });
获取地理位置接口
wx.getLocation({ type: 'wgs84', // 默认为wgs84的gps坐标,若是要返回直接给openLocation用的火星坐标,可传入'gcj02' success: function (res) { var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 var speed = res.speed; // 速度,以米/每秒计 var accuracy = res.accuracy; // 位置精度 } });
摇一摇周边
开启查找周边ibeacon设备接口
wx.startSearchBeacons({ ticket:"", //摇周边的业务ticket, 系统自动添加在摇出来的页面连接后面 complete:function(argv){ //开启查找完成后的回调函数 } });
备注:如需接入摇一摇周边功能,请参考:申请开通摇一摇周边
关闭查找周边ibeacon设备接口
wx.stopSearchBeacons({ complete:function(res){ //关闭查找完成后的回调函数 } });
监听周边ibeacon设备接口
wx.onSearchBeacons({ complete:function(argv){ //回调函数,能够数组形式取得该商家注册的在周边的相关设备列表 } });
备注:上述摇一摇周边接口使用注意事项及更多返回结果说明,请参考:摇一摇周边获取设备信息
界面操做
关闭当前网页窗口接口
wx.closeWindow();
批量隐藏功能按钮接口
wx.hideMenuItems({ menuList: [] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,全部menu项见附录3 });
批量显示功能按钮接口
wx.showMenuItems({ menuList: [] // 要显示的菜单项,全部menu项见附录3 });
隐藏全部非基础按钮接口
wx.hideAllNonBaseMenuItem();
显示全部功能按钮接口
wx.showAllNonBaseMenuItem();
微信扫一扫
调起微信扫一扫接口
wx.scanQRCode({ needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ["qrCode","barCode"], // 能够指定扫二维码仍是一维码,默认两者都有 success: function (res) { var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果 } });
微信小店
跳转微信商品页接口
wx.openProductSpecificView({ productId: '', // 商品id viewType: '' // 0.默认值,普通商品详情页1.扫一扫商品详情页2.小店商品详情页 });
微信卡券
微信卡券接口中使用的签名凭证api_ticket,与步骤三中config使用的签名凭证jsapi_ticket不一样,开发者在调用微信卡券JS-SDK的过程当中需依次完成两次不一样的签名,并确保凭证的缓存。
获取api_ticket
api_ticket 是用于调用微信卡券JS API的临时票据,有效期为7200 秒,经过access_token 来获取。
开发者注意事项:
1.此用于卡券接口签名的api_ticket与步骤三中经过config接口注入权限验证配置使用的jsapi_ticket不一样。
2.因为获取api_ticket 的api 调用次数很是有限,频繁刷新api_ticket 会致使api调用受限,影响自身业务,开发者需在本身的服务存储与更新api_ticket。
接口调用请求说明
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
参数说明
参数 | 是否必须 | 说明 |
access_token | 是 | 接口调用凭证 |
返回数据
数据示例:
{ "errcode":0, "errmsg":"ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA", "expires_in":7200 }
参数名 | 描述 |
errcode | 错误码 |
errmsg | 错误信息 |
ticket | api_ticket,卡券接口中签名所需凭证 |
expires_in | 有效时间 |
拉取适用卡券列表并获取用户选择信息
wx.chooseCard({ shopId: '', // 门店Id cardType: '', // 卡券类型 cardId: '', // 卡券Id timestamp: 0, // 卡券签名时间戳 nonceStr: '', // 卡券签名随机串 signType: '', // 签名方式,默认'SHA1' cardSign: '', // 卡券签名 success: function (res) { var cardList= res.cardList; // 用户选中的卡券列表信息 } });
参数名 | 必填 | 类型 | 示例值 | 描述 |
shopId | 否 | string(24) | 1234 | 门店ID。shopID用于筛选出拉起带有指定location_list(shopID)的卡券列表,非必填。 |
cardType | 否 | string(24) | GROUPON | 卡券类型,用于拉起指定卡券类型的卡券列表。当cardType为空时,默认拉起全部卡券的列表,非必填。 |
cardId | 否 | string(32) | p1Pj9jr90_SQRaVqYI239Ka1erk | 卡券ID,用于拉起指定cardId的卡券列表,当cardId为空时,默认拉起全部卡券的列表,非必填。 |
timestamp | 是 | string(32) | 14300000000 | 时间戳。 |
nonceStr | 是 | string(32) | sduhi123 | 随机字符串。 |
signType | 是 | string(32) | SHA1 | 签名方式,目前仅支持SHA1 |
cardSign | 是 | string(64) | abcsdijcous123 | 签名。 |
cardSign详见附录4。开发者特别注意:签名错误会致使拉取卡券列表异常为空,请仔细检查参与签名的参数有效性。
特别提醒
拉取列表仅与用户本地卡券有关,拉起列表异常为空的状况一般有三种:签名错误、时间戳无效、筛选机制有误。请开发者依次排查定位缘由。
批量添加卡券接口
wx.addCard({ cardList: [{ cardId: '', cardExt: '' }], // 须要添加的卡券列表 success: function (res) { var cardList = res.cardList; // 添加的卡券列表信息 } });
cardExt详见附录4,值得注意的是,这里的card_ext参数必须与参与签名的参数一致,格式为字符串而不是Object,不然会报签名错误。
建议开发者一次添加的卡券不超过5张,不然会遇到超时报错。
查看微信卡包中的卡券接口
wx.openCard({ cardList: [{ cardId: '', code: '' }]// 须要打开的卡券列表 });
微信支付
发起一个微信支付请求
wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的全部使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } });
备注:prepay_id 经过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。
微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
附录1-JS-SDK使用权限签名算法
jsapi_ticket
生成签名以前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常状况下,jsapi_ticket的有效期为7200秒,经过access_token来获取。因为获取jsapi_ticket的api调用次数很是有限,频繁刷新jsapi_ticket会致使api调用受限,影响自身业务,开发者必须在本身的服务全局缓存jsapi_ticket 。
1.参考如下文档获取access_token(有效期7200秒,开发者必须在本身的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
2.用第一步拿到的access_token 采用http GET方式请求得到jsapi_ticket(有效期7200秒,开发者必须在本身的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
成功返回以下JSON:
{ "errcode":0, "errmsg":"ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in":7200 }
得到jsapi_ticket以后,就能够生成JS-SDK权限验证的签名了。
签名算法
签名生成规则以下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对全部待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里须要注意的是全部参数名均为小写字符。对string1做sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
即signature=sha1(string1)。 示例: noncestr=Wm3WZYTPz0wzccnW jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg timestamp=1414587457 url=http://mp.weixin.qq.com?params=value
步骤1. 对全部待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
步骤2. 对string1进行sha1签名,获得signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
注意事项
1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2.签名用的url必须是调用JS接口页面的完整URL。
3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。
如出现invalid signature 等错误详见附录5常见错误及解决办法。
附录2-全部JS接口列表
版本1.0.0接口
onMenuShareTimeline
onMenuShareAppMessage
onMenuShareQQ
onMenuShareWeibo
onMenuShareQZone
startRecord
stopRecord
onVoiceRecordEnd
playVoice
pauseVoice
stopVoice
onVoicePlayEnd
uploadVoice
downloadVoice
chooseImage
previewImage
uploadImage
downloadImage
translateVoice
getNetworkType
openLocation
getLocation
hideOptionMenu
showOptionMenu
hideMenuItems
showMenuItems
hideAllNonBaseMenuItem
showAllNonBaseMenuItem
closeWindow
scanQRCode
chooseWXPay
openProductSpecificView
addCard
chooseCard
openCard
附录3-全部菜单项列表
基本类
举报: "menuItem:exposeArticle"
调整字体: "menuItem:setFont"
日间模式: "menuItem:dayMode"
夜间模式: "menuItem:nightMode"
刷新: "menuItem:refresh"
查看公众号(已添加): "menuItem:profile"
查看公众号(未添加): "menuItem:addContact"
传播类
发送给朋友: "menuItem:share:appMessage"
分享到朋友圈: "menuItem:share:timeline"
分享到QQ: "menuItem:share:qq"
分享到Weibo: "menuItem:share:weiboApp"
收藏: "menuItem:favorite"
分享到FB: "menuItem:share:facebook"
分享到 QQ 空间/menuItem:share:QZone
保护类
编辑标签: "menuItem:editTag"
删除: "menuItem:delete"
复制连接: "menuItem:copyUrl"
原网页: "menuItem:originPage"
阅读模式: "menuItem:readMode"
在QQ浏览器中打开: "menuItem:openWithQQBrowser"
在Safari中打开: "menuItem:openWithSafari"
邮件: "menuItem:share:email"
一些特殊公众号: "menuItem:share:brand"
附录4-卡券扩展字段及签名生成算法
JSSDK使用者请读这里,JSAPI用户能够跳过
卡券签名和JSSDK的签名彻底独立,二者的算法和意义彻底不一样,请不要混淆。JSSDK的签名是使用全部JS接口都须要走的一层鉴权,用以标识调用者的身份,和卡券自己并没有关系。其次,卡券的签名考虑到协议的扩展性和简单的防数据擅改,设计了一套独立的签名协议。另外因为历史缘由,卡券的JS接口先于JSSDK出现,当时的JSAPI并无鉴权体系,因此在卡券的签名里也加上了appsecret/api_ticket这些身份信息,但愿开发者理解。
卡券 api_ticket
卡券 api_ticket 是用于调用卡券相关接口的临时票据,有效期为 7200 秒,经过 access_token 来获取。这里要注意与 jsapi_ticket 区分开来。因为获取卡券 api_ticket 的 api 调用次数很是有限,频繁刷新卡券 api_ticket 会致使 api 调用受限,影响自身业务,开发者必须在本身的服务全局缓存卡券 api_ticket 。
1.参考如下文档获取access_token(有效期7200秒,开发者必须在本身的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
2.用第一步拿到的access_token 采用http GET方式请求得到卡券 api_ticket(有效期7200秒,开发者必须在本身的服务全局缓存卡券 api_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
卡券扩展字段cardExt说明
cardExt自己是一个JSON字符串,是商户为该张卡券分配的惟一性信息,包含如下字段:
字段 | 是否必填 | 是否参与签名 | 说明 |
code | 否 | 是 | 指定的卡券code码,只能被领一次。自定义code模式的卡券必须填写,非自定义code和预存code模式的卡券没必要填写。详情见:是否自定义code码 |
openid | 否 | 是 | 指定领取者的openid,只有该用户能领取。bind_openid字段为true的卡券必须填写,bind_openid字段为false没必要填写。 |
timestamp | 是 | 是 | 时间戳,商户生成从1970年1月1日00:00:00至今的秒数,即当前的时间,且最终须要转换为字符串形式;由商户生成后传入,不一样添加请求的时间戳须动态生成,若重复将会致使领取失败!。 |
nonce_str | 否 | 是 | 随机字符串,由开发者设置传入,增强安全性(若不填写可能被重放请求)。随机字符串,不长于32位。推荐使用大小写字母和数字,不一样添加请求的nonce须动态生成,若重复将会致使领取失败。 |
fixed_begintimestamp | 否 | 否 | 卡券在第三方系统的实际领取时间,为东八区时间戳(UTC+8,精确到秒)。当卡券的有效期类型为DATE_TYPE_FIX_TERM时专用,标识卡券的实际生效时间,用于解决商户系统内起始时间和领取时间不一样步的问题。 |
outer_str | 否 | 否 | 领取渠道参数,用于标识本次领取的渠道值。 |
signature | 是 | - | 签名,商户将接口列表中的参数按照指定方式进行签名,签名方式使用SHA1,具体签名方案参见下文;由商户按照规范签名后传入。 |
签名说明
1.将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。
2.将全部参数字符串拼接成一个字符串进行sha1加密,获得signature。
3.signature中的timestamp,nonce字段和card_ext中的timestamp,nonce_str字段必须保持一致。
4.code=1434008071,timestamp=1404896688,card_id=pjZ8Yt1XGILfi-FUsewpnnolGgZk, api_ticket=ojZ8YtyVyr30HheH3CM73y7h4jJE ,nonce_str=123 则signature=sha1(12314048966881434008071ojZ8YtyVyr30HheH3CM73y7h4jJE pjZ8Yt1XGILfi-FUsewpnnolGgZk)=d9ef8e3010c894d785c667efdcdd10e0260bf014。
强烈建议开发者使用卡券资料包中的签名工具SDK进行签名或使用debug工具进行校验:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign
卡券签名cardSign说明
1.将 api_ticket、appid、location_id、timestamp、nonce_str、card_id、card_type的value值进行字符串的字典序排序。
2.将全部参数字符串拼接成一个字符串进行sha1加密,获得cardSign。
附录5-常见错误及解决方法
调用config 接口的时候传入参数 debug: true 能够开启debug模式,页面会alert出错误信息。如下为常见错误及解决方法:
1.invalid url domain当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,仅支持80(http)和443(https)两个端口,所以不须要填写端口号(一个appid能够绑定三个有效域名,见 目录1.1.1)。
2.invalid signature签名错误。建议按以下顺序检查:
1.确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
2.确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
3.确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
4.确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
5.确保必定缓存access_token和jsapi_ticket。
6.确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。若是是html的静态页面在前端经过ajax将url传到后台签名,前端须要用js获取当前页面除去'#'hash部分的连接(可用location.href.split('#')[0]获取,并且须要encodeURIComponent),由于页面一旦分享,微信客户端会在你的连接末尾加入其它参数,若是不是动态获取当前连接,将致使分享后的页面签名失败。
3.the permission value is offline verifying这个错误是由于config没有正确执行,或者是调用的JSAPI没有传入config的jsApiList参数中。建议按以下顺序检查:
1.确认config正确经过。
2.若是是在页面加载好时就调用了JSAPI,则必须写在wx.ready的回调中。
3.确认config的jsApiList参数包含了这个JSAPI。
4.permission denied该公众号没有权限使用这个JSAPI,或者是调用的JSAPI没有传入config的jsApiList参数中(部分接口须要认证以后才能使用)。
5.function not exist当前客户端版本不支持该接口,请升级到新版体验。
6.为何6.0.1版本config:ok,可是6.0.2版本以后不ok(由于6.0.2版本以前没有作权限验证,因此config都是ok,但这并不意味着你config中的签名是OK的,请在6.0.2检验是否生成正确的签名以保证config在高版本中也ok。)
7.在iOS和Android都没法分享(请确认公众号已经认证,只有认证的公众号才具备分享相关接口权限,若是确实已经认证,则要检查监听接口是否在wx.ready回调函数中触发)
8.服务上线以后没法获取jsapi_ticket,本身测试时没问题。(由于access_token和jsapi_ticket必需要在本身的服务器缓存,不然上线后会触发频率限制。请确保必定对token和ticket作缓存以减小2次服务器请求,不只能够避免触发频率限制,还加快大家本身的服务速度。目前为了方便测试提供了1w的获取量,超过阀值后,服务将再也不可用,请确保在服务上线前必定全局缓存access_token和jsapi_ticket,二者有效期均为7200秒,不然一旦上线触发频率限制,服务将再也不可用)。
9.uploadImage怎么传多图(目前只支持一次上传一张,多张图片需等前一张图片上传以后再调用该接口)
10.无法对本地选择的图片进行预览(chooseImage接口自己就支持预览,不须要额外支持)
11.经过a连接(例如先经过微信受权登陆)跳转到b连接,invalid signature签名失败(后台生成签名的连接为使用jssdk的当前连接,也就是跳转后的b连接,请不要用微信登陆的受权连接进行签名计算,后台签名的url必定是使用jssdk的当前页面的完整url除去'#'部分)
12.出现config:fail错误(这是因为传入的config参数不全致使,请确保传入正确的appId、timestamp、nonceStr、signature和须要使用的jsApiList)
13.如何把jsapi上传到微信的多媒体资源下载到本身的服务器(请参见文档中uploadVoice和uploadImage接口的备注说明)
14.Android经过jssdk上传到微信服务器,第三方再从微信下载到本身的服务器,会出现杂音(微信团队已经修复此问题,目先后台已优化上线)
15.绑定父级域名,是否其子域名也是可用的(是的,合法的子域名在绑定父域名以后是彻底支持的)
16.在iOS微信6.1版本中,分享的图片外链不显示,只能显示公众号页面内链的图片或者微信服务器的图片,已在6.2中修复
17.是否须要对低版本本身作兼容(jssdk都是兼容低版本的,不须要第三方本身额外作更多工做,但有的接口是6.0.2新引入的,只有新版才可调用)
18.该公众号支付签名无效,没法发起该笔交易(请确保你使用的jweixin.js是官方线上版本,不只能够减小用户流量,还有可能对某些bug进行修复,拷贝到第三方服务器中使用,官方将不对其出现的任何问题提供保障,具体支付签名算法可参考 JSSDK微信支付一栏)
19.目前Android微信客户端不支持pushState的H5新特性,因此使用pushState来实现web app的页面会致使签名失败,此问题已在Android6.2中修复
20.uploadImage在chooseImage的回调中有时候Android会不执行,Android6.2会解决此问题,若需支持低版本能够把调用uploadImage放在setTimeout中延迟100ms解决
21.require subscribe错误说明你没有订阅该测试号,该错误仅测试号会出现
22.getLocation返回的坐标在openLocation有误差,由于getLocation返回的是gps坐标,openLocation打开的腾讯地图为火星坐标,须要第三方本身作转换,6.2版本开始已经支持直接获取火星坐标
23.查看公众号(未添加): "menuItem:addContact"不显示,目前仅有从公众号传播出去的连接才能显示,来源必须是公众号
24.ICP备案数据同步有一天延迟,因此请在第二日绑定
注意:
1.getLocation和openLocation
我在开发的时候遇到一个问题,就是我每次调用getLocation这个接口的时候是通的,可是openLocation这个接口怎么调用也不通,调了很长时间就是不行,下面我把我代码列一下
<script> wx.config({ debug: false, appId: '{$appId}', timestamp: '{$timestamp}', nonceStr: '{$nonceStr}', signature: '{$signature}', jsApiList: ['previewImage','getLocation','openLocation'] }); var __cururl = "{$cururl}"; wx.ready(function () { $('[node-type="address_btn"]').on('click',function (){ wx.openLocation({ latitude: x坐标, longitude: y坐标, name: address, address: address, scale: 14 }); }); }); wx.error(function (res) { alert(res.errMsg); }); </script>
代码很简单,根本没有变更,彻底按照官网的api写的,就连参数都是用的官网的参数,怎么地图的出不来,尤为ios安装有的时候还能出来,可是也是随机性,我在网上找了好久解决办法,发现碰见问题的人很多,还挺多的,可是没有一种办法能解决问题,下面我说下网上解决办法
第一种:都是让你看看你的初始化里面是否添加了你要用的接口
第二种:坐标参数是不容许用字符串的
第三种:坐标参数是火星坐标,也就是说你先调用getLocation获取坐标信息,而后在调用openLocation来实现地图展现
我记忆里就大概就这三个了,我都尝试了,就是出不来不知道为啥,初始化里面确定添加了,由于我尝试用checkJsApi这个接口来检测了(用来检测你要用的接口是否可用),返回的信息是ok,openLocation这个接口是能够用的,可是执行到这个接口的时候就报错,提示没有权限,怎么都掉不通
墨迹半天了,说最后问题出在了那里,其实很简单,就是执行顺序问题
具体微信是怎么作的我不知道,可是你初始化接口的时候,是要必定的时间的,有些接口会很快,可是有些接口确实慢,也许是他要加载一些东西吧
好比我用过几个接口getLocation,checkJsApi,uploadImage,previewImage等等 都是没有问题的,上面的代码那样写没有问题,api都是通的,可是openLocation这个接口就不行了,官网的dome就能出来,本身本地就是出不来,最后我发现一个问题,就是官网的config是页面直接写在script标签里面的,可是全部的接口都是写在一个文件里面的ready这里面的接口都是写在一个js文件里面的,而后页面引入这个文件就行了,只要你把ready里面所用的接口都放在一个文件里面,全部的接口都通,openLocation这个接口天然也就通了
这就是我所说的,就是页面加载顺序,若是你把代码放在一个js文件里面是最后加载的,可是在script标签里面的代码是先执行的,跟随dome一块儿加载,这些都加载完了在加载js文件,有人会说若是把js文件写在前面不就好了吗,那也不行,就算你写在前面页面执行到你script标签的时候发现是一个文件,那么他就得去服务器取这个文件,而后在加载到页面上,速度仍是不如script执行的快,由于有网络延迟
暂时就遇到这些问题,之后若是有问题继续补充,也欢迎你们有问题评论在下面,我去验证,而后加上