微信js-sdk开发获取签名和获取地理位置接口示例


前言:在做微信公众号开发时需要获取用户的地理位置信息,之前通过高德或者百度、腾讯等地图的api时发现经常获取不到,毕竟第三方的东西,后来改为采用微信内置的js-sdk中的获取地理位置接口,在这主要记录下签名的获取(麻烦点)和一个获取地理位置的例子。

准备工作:

  1. 微信测试号appid和appsecret

    获取地址:微信测试账号获取
  2. 在测试账号里先填写接口配置信息和js接口安全域名(这个是必须的)
  3. 示例:页面中需要点击图标获取地理位置信息

    流程如下:

    点击按钮->触发事件去获取->ajax异步获取签名->拿签名去获取地理位置->得到经纬度->高德api再去逆地理编码获取真实地址信息
前端代码如下:(主要是使用js-sdk,直接拿来用就行,换下ajax请求地址)
<!--引入js-sdk-->
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> <!--点击图标触发事件-->
<img onclick="getCurrentLocation()" src="__PUBLIC__/img/gap.png"> //根据微信js-sdk内置接口 getCurrentLocation
function getCurrentLocation(){
//这个是获取签名时的url,动态变化,所以在前段获取,后端传入直接使用
var url = location.href.split('#')[0];
var ajaxUrl = '/*****/getWxsdkSign'; //ajax异步获取微信签名sign
$.get(ajaxUrl, {url : url}, function(json){
if(json.code == 0){
let sdkSign = json.data; // 后台返回的值
wx.config({
debug: false, // ture会alert全部信息,上线时改为false
appId: sdkSign.appId, // 必填,公众号唯一标识
timestamp: sdkSign.timestamp, // 必填,生成签名的时间戳
nonceStr: sdkSign.nonceStr, // 必填,生成签名的随机串
signature: sdkSign.signature,// 必填,签名
jsApiList: ['getLocation',] // 必填,需要调用的接口列表,本需求里只是获取位置信息,具体的接口名称查阅js-sdk文档
});
//获取地理位置(经纬度)
wx.getLocation({
type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; //纬度,浮点数
var longitude = res.longitude; //经度,浮点数
//以下这部分内容就是再通过异步操作逆地理编码获取真实的地址信息
getLocationBylatlng(latitude, longitude);
}
});
}else{
//TODO 获取签名失败的处理,未获取到地理位置
*****************
*****************
}
},'json');
}
后端代码如下:(主要是用来获取js-sdk的签名,非常重要)
/*---------------------------------获取js-sdk签名   start--------------------------------*/
/**
* 获取js-sdk调用权限,获取签名
*/
public function getWxsdkSign(){
$appId = $this->appid; //这里填appid
$appsecret = $this->appsecret; //这里填appsecret
//一般$url是固定的,可以写死,但是我的项目中地址是动态的,所以由前段传入
$url = I('get.url'); //获取签名的页面的url地址,由于是动态地址,所以由前段传入
// 获取accesstoken
$accessToken = $this->getAccessToken();
if(empty($accessToken)){
$this->ajaxReturn(['code'=>-1, 'msg'=>'accessToken未获取到']);
}
// 获取jsapi_ticket
$jsapi_ticket = $this->_getJsapiTicket($accessToken);
if(empty($jsapi_ticket)){
$this->ajaxReturn(['code'=>-1, 'msg'=>'jsapi_ticket未获取到']);
}
$nonceStr = $this->make_nonceStr(); //获取随机字符串
$timestamp = time();
$signature = $this->make_signature($nonceStr,$timestamp,$jsapi_ticket,$url);
$sdkSign = array(
'appId' => $this->appid, //appid
'signature' => $signature, //签名
'timestamp' => $timestamp, //时间戳
'nonceStr' => $nonceStr, //随机字符串
);
$this->ajaxReturn(['code'=>0, 'data'=>$sdkSign]);
} /**
* 此AccessToken 与 getUserAccessToken不一样,注意一下定要全局缓存,否则每日次数限制很快就GG了
* 获得AccessToken
*/
private function getAccessToken()
{
//获取缓存(我用的是自己封装的Memcached类,Vender引入的直接使用)
Vendor('Memcacheds.Memcacheds');
$memcached = new \Memcacheds();
$access = $memcached->get_cache('access_token');
// 缓存不存在-重新创建
if (empty($access)) {
// 获取 access token
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this -> appid}&secret={$this->appsecret}";
$accessToken = file_get_contents($url);
$accessToken = json_decode($accessToken);
// 保存至缓存
$access = $accessToken->access_token;
$memcached->set_cache('access_token', $access, 7000);
}
return $access;
} /**
* 获取JS证明 注意一下定要全局缓存,否则每日次数限制很快就GG了
* @param $accessToken
*/
private function _getJsapiTicket($accessToken)
{
Vendor('Memcacheds.Memcacheds');
$memcached = new \Memcacheds();
//获取缓存
$ticket = $memcached->get_cache('jsapi_ticket');
//缓存不存在-重新创建
if (empty($ticket)) {
// 获取js_ticket
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $accessToken . "&type=jsapi";
$jsTicket = file_get_contents($url);
$jsTicket = json_decode($jsTicket);
//保存至缓存
$ticket = $jsTicket->ticket;
$memcached->set_cache('jsapi_ticket', $ticket, 7000);
}
return $ticket;
} //获取随机字符串
public function make_nonceStr(){
$codeSet = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
for ($i = 0; $i<16; $i++) {
$codes[$i] = $codeSet[mt_rand(0, strlen($codeSet)-1)];
}
$nonceStr = implode($codes);
return $nonceStr;
} /**
* 获取签名
* @param string $nonceStr 随机字符串
* @param int $timestamp 时间戳
* @param string $jsapi_ticket 获取的ticket凭据
* @param string $url 获取签名的页面的url 'http://*****' eg:'http://wx.alisleept.top/index.php'
*/
function make_signature($nonceStr,$timestamp,$jsapi_ticket,$url){
$tmpArr = array(
'noncestr' => $nonceStr,
'timestamp' => $timestamp,
'jsapi_ticket' => $jsapi_ticket,
'url' => $url
);
ksort($tmpArr, SORT_STRING);
$string1 = http_build_query( $tmpArr );
$string1 = urldecode( $string1 );
$signature = sha1( $string1 );
return $signature;
}
/*---------------------------------获取js-sdk签名 end--------------------------------*/

以上php部分就是完全的异步获取签名的代码,里边只需要注意

  1. appidappsecret 修改为自己的
  2. 注意access_tokenjsapi_ticket的缓存
  3. 注意$url换成自己的,我这个是动态的,所以前段传回的

微信js-sdk开发获取签名和获取地理位置接口示例的更多相关文章

  1. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  2. 微信-js sdk invalid signature签名错误 问题解决

    如果出现 invalid signature,首先可以确定的是你的签名算法有问题.建议:首先查看微信官方网站给出的解决方案,链接为: http://mp.weixin.qq.com/wiki/7/aa ...

  3. 实战微信JS SDK开发:贺卡制作与播放(2)

    最近同事用CanTK开发了一个基于微信的贺卡制作APP,我虽然没有参与开发,但是提供CanTK和GameBuilder的技术支持,觉得有些东西比较有意思,写几篇博客和大家分享吧.这个贺卡APP完全开源 ...

  4. 微信公众号开发(三)获取access_token

    微信公众号开发(三)获取access_token 1.说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.acce ...

  5. 微信JS SDK接入的几点注意事项

    微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...

  6. 微信js sdk上传多张图片

    微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...

  7. 微信公众号开发(二)获取AccessToken、jsapi_ticket

    Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...

  8. 微信js sdk分享开发摘记java版

    绑定域名和引入js的就不说了 废话不说直接上代码 public void share(HttpServletRequest request) throws Exception { StringBuff ...

  9. 微信公众平台开发(99) 自定义菜单获取OpenID

    关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...

随机推荐

  1. 【Spark篇】--Spark中Standalone的两种提交模式

    一.前述 Spark中Standalone有两种提交模式,一个是Standalone-client模式,一个是Standalone-master模式. 二.具体         1.Standalon ...

  2. 死磕 java集合之WeakHashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时 ...

  3. pdf生成库-libharu编译

    相关文章:libharu 源码编译 VS2010 1.首先下载libharu源码,libharu依赖于libpng和libzib,如果编译过libpng和libzib的话,直接拿过来用即可.否则需要自 ...

  4. TP3.2框架中的字母函数解析

    C的使用方法以及注意事项 使用方法: 1.读取配置 C('参数名称')  配置参数不区分大小写,存在则设置,否则返回NULL; 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个 ...

  5. RabbitMQ消息队列(四)-服务详细配置与日常监控管理

    RabbitMQ服务管理 启动服务:rabbitmq-server -detached[ /usr/local/rabbitmq/sbin/rabbitmq-server -detached ] 查看 ...

  6. Signalr指定Websocket方式跨域数据传输

    跨域通俗理解就是两个域名后面的web服务地址,即都是独立的网站.现实业务的情况会有很多需要跨域推送数据的情况, 比如类似饿了么商户后台会收到客户端确认订单后,后台服务会推送一条订单消息给商户前台. S ...

  7. SpringCloud-Greenwich版本新特性探索(1)---SpringCloudGateway

    一.前言 1.SpringCloudGateway是SpringCloud新推出的网关框架,比较于上一代Zuul,功能和性能有很大的提升.Zuul1.x采用的是阻塞多线程方式,也就是一个线程处理一个连 ...

  8. C# 1-2+3-4+5...+m的几种方法

    class Program { //第一种(1-2)+(3-4)+(5-6)...+m public static void Test(int m) { ; == ) { z = -(m / ); } ...

  9. [Go] golang缓冲通道实现管理一组goroutine工作

    通道1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小3.无缓冲通道需要发送和接收都准备好,否则 ...

  10. 解决ajaxfileupload上传文件在IE浏览器返回data为空问题

    关于ajaxfileupload,建议还是别用,已经没有人维护的脚本了,笔者就是入了这个坑. 在IE浏览器中ajaxfileupload返回data为空 jq.ajaxFileUpload ( { u ...