2017-02-14 17:35:29 linfanhehe 阅读数 1095
  • 自己开发一套微信支付接口(SDK)-微信开发15(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 边栏可办理会员卡。自己开发一套微信支付接口(SDK)是子恒老师《子恒说微信开发》视频教程的第15部。详细讲解了用php开发一套自己的微信支付接口。内容包含微信支付开发思路,基础类开发,微信支付接口应用,公众号发红包,企业付款等等。欢迎反馈,微信号:QQ68183131

    5400 人正在学习 去看看 秦子恒

文章来源http://www.vxzsk.com/115.html


章节给大家介绍通过微信jsapi获取用户的地理位置,微信官方文档关于地理位置给了两种接口,一种是通过微信内置地图查看用户的地理位置,第二种是直接获取当前用户的地理位置坐标信息。

使用微信内置地图查看位置接口


1
2
3
4
5
6
7
8
wx.openLocation({
    latitude: 0, // 纬度,浮点数,范围为90 ~ -90
    longitude: 0, // 经度,浮点数,范围为180 ~ -180。
    name: ''// 位置名
    address: ''// 地址详情说明
    scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
    infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
});

获取地理位置接口

1
2
3
4
5
6
7
8
9
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; // 位置精度
    }
});

以上是微信官方文档给的接口使用说明,接下来我们介绍如何编写代码调用以上接口。

第一、jsp界面引入js库

1
2
 <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"> </script> 
 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>

第二、<body></body>之间的html代码

1
2
3
4
<span class="desc" style="color: red">地理位置接口-使用微信内置地图查看位置接口</span><br>
      <button class="btn btn_primary" id="openLocation">openLocation</button><br>
      <span class="desc" style="color: red">地理位置接口-获取地理位置接口</span><br>
      <button class="btn btn_primary" id="getLocation">getLocation</button><br>

第三、初始化微信jsapi库添加的上述两种接口openLocation接口和getLocation接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 wx.config({  
    debug: true// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。  
    appId: '${appId}'// 必填,公众号的唯一标识  
    timestamp: '${ timestamp}' // 必填,生成签名的时间戳  
    nonceStr: '${ nonceStr}'// 必填,生成签名的随机串  
    signature: '${ signature}',// 必填,签名,见附录1  
    jsApiList: ['checkJsApi',
                'chooseImage',
                'previewImage',
                 'uploadImage',
                 'downloadImage',
                  'getNetworkType',//网络状态接口
                  'openLocation',//使用微信内置地图查看地理位置接口
                  'getLocation' //获取地理位置接口
               // 必填,需要使用的JS接口列表,所有JS接口列表见附录2  
});

第四、调用openLocation接口和getLocation接口两种接口的js代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 7 地理位置接口 开始
  // 7.1 查看地理位置
  document.querySelector('#openLocation').onclick = function () {
    wx.openLocation({
      latitude: 23.099994,
      longitude: 113.324520,
      name: 'TIT 创意园',
      address: '广州市海珠区新港中路 397 号',
      scale: 14,
      infoUrl: 'http://weixin.qq.com'
    });
  };
 
  // 7.2 获取当前地理位置
  document.querySelector('#getLocation').onclick = function () {
    wx.getLocation({
      success: function (res) {
        alert(JSON.stringify(res));
      },
      cancel: function (res) {
        alert('用户拒绝授权获取地理位置');
      }
    });
  };
  // 7 地理位置接口 结束

这两个js方法是在上述第二步中用户点击id分别为openLocation和getLocation按钮的时候触发。注意这两种方法要放在wx.ready(function(){ });之间。

第五、完整的jsp页面代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <!-- www.vxzsk.com原创 -->
    <title>微信jsapi测试-V型知识库</title>
    <meta name="viewport" content="width=320.1,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
   <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"> </script
   <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
     
  </head>
   
  <body>
  <center><h3>欢迎来到微信jsapi测试界面-V型知识库</h3></center>
     <p>基础接口之判断当前客户端是否支持指定的js接口</p>   
     <input type="button" value="checkJSAPI" id="checkJsApi"><br>
      
      <span class="desc" style="color: red">地理位置接口-使用微信内置地图查看位置接口</span><br>
      <button class="btn btn_primary" id="openLocation">openLocation</button><br>
      <span class="desc" style="color: red">地理位置接口-获取地理位置接口</span><br>
      <button class="btn btn_primary" id="getLocation">getLocation</button><br>
      
     <div style="display: none;"
     <span class="desc" style="color: red">获取网络状态接口</span><br>
      <button class="btn btn_primary" id="getNetworkType">getNetworkType</button><br>
      <h3 id="menu-image">图像接口</h3>
      <span class="desc">拍照或从手机相册中选图接口</span><br>
      <button class="btn btn_primary" id="chooseImage">chooseImage</button><br>
      <span class="desc">预览图片接口</span><br>
      <button class="btn btn_primary" id="previewImage">previewImage</button><br>
      <span class="desc">上传图片接口</span><br>
      <button class="btn btn_primary" id="uploadImage">uploadImage</button><br>
      <span class="desc">下载图片接口</span><br>
      <button class="btn btn_primary" id="downloadImage">downloadImage</button><br>
     
  <br>
  显示图片<img alt="" src="" id="faceImg">
  </div>
   
   
  <script type="text/javascript">
  wx.config({  
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。  
    appId: '${appId}', // 必填,公众号的唯一标识  
    timestamp: '${ timestamp}' , // 必填,生成签名的时间戳  
    nonceStr: '${ nonceStr}', // 必填,生成签名的随机串  
    signature: '${ signature}',// 必填,签名,见附录1  
    jsApiList: ['checkJsApi',
                'chooseImage',
                'previewImage',
                 'uploadImage',
                 'downloadImage',
                  'getNetworkType',//网络状态接口
                  'openLocation',//使用微信内置地图查看地理位置接口
                  'getLocation' //获取地理位置接口
               ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2  
});  
   
wx.ready(function(){  
    // 5 图片接口
  // 5.1 拍照、本地选图
  var images = {
    localId: [],
    serverId: []
  };
  document.querySelector('#chooseImage').onclick = function () {
    wx.chooseImage({
      success: function (res) {
        images.localId = res.localIds;
        alert('已选择 ' + res.localIds.length + ' 张图片');
         $("#faceImg").attr("src", res.localIds[0]);//显示图片到页面上
      }
    });
  };
 
  // 5.2 图片预览
  document.querySelector('#previewImage').onclick = function () {
    wx.previewImage({
      current: 'http://www.vxzsk.com/upload//bf04c9b5-5699-421d-900e-3b68bbe58a8920160816.jpg',
      urls: [
        'http://www.vxzsk.com/upload//bf04c9b5-5699-421d-900e-3b68bbe58a8920160816.jpg',
        'http://www.vxzsk.com/upload//bf04c9b5-5699-421d-900e-3b68bbe58a8920160816.jpg',
        'http://www.vxzsk.com/upload//bf04c9b5-5699-421d-900e-3b68bbe58a8920160816.jpg'
      ]
    });
  };
 
  // 5.3 上传图片
  document.querySelector('#uploadImage').onclick = function () {
    if (images.localId.length == 0) {
      alert('请先使用 chooseImage 接口选择图片');
      return;
    }
    var i = 0, length = images.localId.length;
    images.serverId = [];
    function upload() {
      wx.uploadImage({
        localId: images.localId[i],
        success: function (res) {
          i++;
          //alert('已上传:' + i + '/' + length);
          images.serverId.push(res.serverId);
          if (i < length) {
            upload();
          }
        },
        fail: function (res) {
          alert(JSON.stringify(res));
        }
      });
    }
    upload();
  };
 
  // 5.4 下载图片
  document.querySelector('#downloadImage').onclick = function () {
    if (images.serverId.length === 0) {
      alert('请先使用 uploadImage 上传图片');
      return;
    }
    var i = 0, length = images.serverId.length;
    images.localId = [];
    function download() {
      wx.downloadImage({
        serverId: images.serverId[i],
        success: function (res) {
          i++;
          alert('已下载:' + i + '/' + length);
          images.localId.push(res.localId);
          if (i < length) {
            download();
          }
        }
      });
    }
    download();
  };
   
  // 6 设备信息接口
  // 6.1 获取当前网络状态
  document.querySelector('#getNetworkType').onclick = function () {
    wx.getNetworkType({
      success: function (res) {
        alert(res.networkType);
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };
  //网络接口结束
   
  // 7 地理位置接口 开始
  // 7.1 查看地理位置
  document.querySelector('#openLocation').onclick = function () {
    wx.openLocation({
      latitude: 23.099994,
      longitude: 113.324520,
      name: 'TIT 创意园',
      address: '广州市海珠区新港中路 397 号',
      scale: 14,
      infoUrl: 'http://weixin.qq.com'
    });
  };
 
  // 7.2 获取当前地理位置
  document.querySelector('#getLocation').onclick = function () {
    wx.getLocation({
      success: function (res) {
        alert(JSON.stringify(res));
      },
      cancel: function (res) {
        alert('用户拒绝授权获取地理位置');
      }
    });
  };
  // 7 地理位置接口 结束 
   
});  
 //初始化jsapi接口 状态
wx.error(function (res) {
  alert("调用微信jsapi返回的状态:"+res.errMsg);
});
   
 </script>
    
  </body>
</html>

上述jsp代码中有四个参数,这四个参数是成功调用微信jsapi的凭证,分别为appId(必填,公众号的唯一标识),timestamp(必填,生成签名的时间戳), nonceStr(必填,生成签名的随机串) ,signature(必填,签名),关于如何生成这四个参数,如果不知道的读者,请查看本页面左上角的菜单,里面有详细介绍,在这里不在累述。 

第六、上述代码运行效果图如下:

 使用微信内置地图查看位置接口


获取地理位置接口效果

此文章本站原创,地址 http://www.vxzsk.com/115.html   转载请注明出处!谢谢!



2017-12-06 17:41:04 qq_37936542 阅读数 9218
  • 自己开发一套微信支付接口(SDK)-微信开发15(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 边栏可办理会员卡。自己开发一套微信支付接口(SDK)是子恒老师《子恒说微信开发》视频教程的第15部。详细讲解了用php开发一套自己的微信支付接口。内容包含微信支付开发思路,基础类开发,微信支付接口应用,公众号发红包,企业付款等等。欢迎反馈,微信号:QQ68183131

    5400 人正在学习 去看看 秦子恒

 

步骤一:绑定域名   注意不要加http://

 

 

步骤二:引入js文件

--在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js

 

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>


步骤三:通过ajax获取参数,完成config接口注入权限验证配置

 

 

--ajax请求

 

$(function() {
	
	// 获取本页面的url
	var url = location.href.split('#')[0];
	$.ajax({
		type : "GET",
		url : "signature.action?url=" + url,
		dataType:"json",
		success : function(data) {
			wx.config({
				debug : true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
				appId: data.appid, // 必填,公众号的唯一标识
      	                        timestamp: data.timestamp,  // 必填,生成签名的时间戳
      	                        nonceStr: data.nonceStr,  // 必填,生成签名的随机串
      	                        signature: data.signature,   // 必填,签名,见附录1
				jsApiList : [ 
				                'checkJsApi',
						'openLocation',// 使用微信内置地图查看地理位置接口
						'getLocation' // 获取地理位置接口
				]  // 必填,需要使用的JS接口列表
			});
		}
	});
	
	});

 

--后台代码

 

 

 

注:jsapi-ticket的获取在前一节中讲过,这里就带过

 

@RequestMapping(value = "signature", method = RequestMethod.GET)
	@ResponseBody 
	public Map<String, String> createSignature(@RequestParam String url) 
	{
	  System.out.println("RestFul of createSignature parameters url:"+url);
	  
	  return SignatureUtil.sign(tokenService.getJsapi_ticket(), url);
	}

 

 

 

public static Map<String, String> sign(String jsapi_ticket, String url) {
	        Map<String, String> ret = new HashMap<String, String>();
	        String nonce_str = create_nonce_str();
	        String timestamp = create_timestamp();
	        String str;
	        String signature = "";
	 
	        //注意这里参数名必须全部小写,且必须有序
	        str = "jsapi_ticket=" + jsapi_ticket +
	                  "&noncestr=" + nonce_str +
	                  "×tamp=" + timestamp +
	                  "&url=" + url;
	 
	        try
	        {
	            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
	            crypt.reset();
	            crypt.update(str.getBytes("UTF-8"));
	            signature = byteToHex(crypt.digest());
	        }
	        catch (NoSuchAlgorithmException e)
	        {
	            e.printStackTrace();
	        }
	        catch (UnsupportedEncodingException e)
	        {
	            e.printStackTrace();
	        }
	 
	        ret.put("url", url);
	        ret.put("jsapi_ticket", jsapi_ticket);
	        ret.put("nonceStr", nonce_str);
	        ret.put("timestamp", timestamp);
	        ret.put("signature", signature);
	        ret.put("appid", WeChatInfo.WX_APPID);
	 
	        return ret;
	    }
	    
	    private static String byteToHex(final byte[] hash) {
	        Formatter formatter = new Formatter();
	        for (byte b : hash)
	        {
	            formatter.format("%02x", b);
	        }
	        String result = formatter.toString();
	        formatter.close();
	        return result;
	    }
	 
	    private static String create_nonce_str() {
	        return UUID.randomUUID().toString();
	    }
	 
	    private static String create_timestamp() {
	        return Long.toString(System.currentTimeMillis() / 1000);
	    }
	     
	    //获取当前系统时间 用来判断access_token是否过期
	    public static String getTime(){
	        Date dt=new Date();
	        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        return sdf.format(dt);
	    }

 

步骤四:通过ready接口处理成功验证

 

 

wx.ready(function() {
		// 获取用户位置
		wx.getLocation({
			success : function(res) {
				var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                            var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                            var speed = res.speed; // 速度,以米/每秒计
                            var accuracy = res.accuracy; // 位置精度
			},
			fail : function(res) {
				alert("获取位置失败");
			}
		});
	});


步骤五:通过error接口处理失败验证

 

	wx.error(function(res) {
		alert("获取凭据失败");
	}); 

 

 

 

2017-07-27 12:00:01 qq_17635843 阅读数 14970
  • 自己开发一套微信支付接口(SDK)-微信开发15(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 边栏可办理会员卡。自己开发一套微信支付接口(SDK)是子恒老师《子恒说微信开发》视频教程的第15部。详细讲解了用php开发一套自己的微信支付接口。内容包含微信支付开发思路,基础类开发,微信支付接口应用,公众号发红包,企业付款等等。欢迎反馈,微信号:QQ68183131

    5400 人正在学习 去看看 秦子恒

 

调用微信地理位置接口,需要用到微信的JSSDK,这是微信的介绍:

 

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。

通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

JSSDK使用步骤:

 

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js

备注:支持使用 AMD/CMD 标准模块加载方法加载

步骤三:通过config接口注入权限验证配置

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

wx.config({

    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

    appId: '', // 必填,公众号的唯一标识

    timestamp: , // 必填,生成签名的时间戳

    nonceStr: '', // 必填,生成签名的随机串

    signature: '',// 必填,签名,见附录1

    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

步骤四:通过ready接口处理成功验证

wx.ready(function(){

    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

});

步骤五:通过error接口处理失败验证

wx.error(function(res){

    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。

});

微信文档大概意思是,如果想调微信JSSDK,然后必须引入http://res.wx.qq.com/open/js/jweixin-1.2.0.js,而这个js需要配置成功才能够使用,成功就自动走ready方失败则error。

这里调用地图接口,是wx.openLocation和wx.getLocation,对wx.config进行配置,  jsApiList: []中填这两个接口,其中签名需要在后台进行。

下面介绍如何配置config,一定要注意参数名的大小写,不能错!:

1、appId就不用说了,就是公众号的appId,timestamp是时间戳,生成签名用,这里单位是秒。

 

	    /**
	     * 获取当前时间戳,单位秒
	     * @return
	     */
	    public static long getCurrentTimestamp() {
	        return System.currentTimeMillis()/1000;
	    }

	    /**
	     * 获取当前时间戳,单位毫秒
	     * @return
	     */
	    public static long getCurrentTimestampMs() {
	        return System.currentTimeMillis();
	    }

2、nonceStr,生成签名的随机字符串

 

 

 /**
	     * 获取随机字符串 Nonce Str
	     *
	     * @return String 随机字符串
	     */
	    public static String generateNonceStr() {
	        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
	    }


3、signature,按照微信的签名算法,签名需要的参数noncestr-随机串,jsapi_ticket-临时票据,timestamp-时间戳,url-调用js接口的页面地址,绝对路径,形成签名的方法,分为二步

 

(1)获取access_token,这个access_token有一个过时的问题,有效时间7200秒,而获取access_token每天限制为100000次,所以,我是把access_token存到数据库里,每次用的时候查询一下上次更新的时间是否有超过7200秒,这个时间可以设置的小一些,用来避免临界7200秒的问题,如果超过7200秒再重新请求一次,再更新数据库存入更新的时间。获取到access_token后,再用access_token获取临时票据ticket,就是上面的jsapi_ticket。

 

public static Map<String,String> getTicket() throws ClientProtocolException, IOException{
		Map<String,String> map = new HashMap<String,String>();
		String turl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ConfigUtil.APPID
				+"&secret="+ConfigUtil.APP_SECRECT;
		JSONObject jsonObject = AuthUtil.doGetJson(turl);
		String access_token = jsonObject.optString("access_token");
	    String expires_in = String.valueOf(jsonObject.optInt("expires_in"));
		String turl2 = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token
				+"&type=jsapi";
		JSONObject jsonObject1 = AuthUtil.doGetJson(turl2);
		String ticket = jsonObject1.optString("ticket");
		map.put("expires_in", expires_in);
		map.put("access_token", access_token);
		map.put("ticket", ticket);
		return map;
	}
public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
		JSONObject jsonObject = null;
		DefaultHttpClient client =  new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		HttpResponse response = client.execute(get);
		HttpEntity entity = response.getEntity();
		if(entity!=null){
			String result = EntityUtils.toString(entity, "UTF-8");
			jsonObject = JSONObject.fromObject(result);
		}
		get.releaseConnection();
		return jsonObject;
	}

 

(2)四个参数形成签名,把四个参数用key=value形成四个字符串,然后对其字典序排序,按照顺序用‘&’连接起来,形成一个字符串对其sha1加密,形成签名signature。

 

public static String getSign(String timestamp,String noncestr,String jsapi_ticket,String url){
		
		
		String arr[] =new String[] {"jsapi_ticket="+jsapi_ticket,"noncestr="+noncestr,"timestamp="+timestamp,"url="+url};
		Arrays.sort(arr);//字典序排序
    	String str = "";
		str = arr[0]+"&"+arr[1]+"&"+arr[2]+"&"+arr[3];
	    System.out.println(str);
		String mParms = null;//sha1加密
	    MessageDigest digest = null;
	    try {
	      digest = java.security.MessageDigest.getInstance("SHA");
	    } catch (NoSuchAlgorithmException e) {
	      // TODO Auto-generated catch block
	      e.printStackTrace();
	    }
	    digest.update(str.getBytes());
	    byte messageDigest[] = digest.digest();
	    // Create Hex String
	    StringBuffer hexString = new StringBuffer();
	    for (int i = 0; i < messageDigest.length; i++) {
	      String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
	      if (shaHex.length() < 2) {
	        hexString.append(0);
	      }
	      hexString.append(shaHex);
	    }
	    mParms = hexString.toString();
	    	return mParms;
	    }
	
	
	public static String byteToStr(byte[] byteArray){
		
		String str = "";
		for(int i=0;i<byteArray.length;i++){
			str += byteToHexStr(byteArray[i]); 		
		}
		return str;
		
		
	}
	 
	
	public static String byteToHexStr(byte mbyte){
		char[] Digit = {'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F'};
		char[] tempArr = new char[2];
		tempArr[0] = Digit[(mbyte >>> 4) & 0X0F]; 
		tempArr[1] = Digit[mbyte & 0X0F]; 
		 String s = new String(tempArr); 
		 return s; 
		
		
		
	}

 

 

 

最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,或许有你想看的

 

2016-04-26 22:56:55 Return_True_hang 阅读数 3260
  • 自己开发一套微信支付接口(SDK)-微信开发15(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 边栏可办理会员卡。自己开发一套微信支付接口(SDK)是子恒老师《子恒说微信开发》视频教程的第15部。详细讲解了用php开发一套自己的微信支付接口。内容包含微信支付开发思路,基础类开发,微信支付接口应用,公众号发红包,企业付款等等。欢迎反馈,微信号:QQ68183131

    5400 人正在学习 去看看 秦子恒
  1. 忘记了一点,在使用js接口前,要让公众号js接口设置好域名

  2. 获得Access Token
    通过curl来获取

微信官方给的接口调用请求说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明

参数 是否必须 说明
grant_type 是 获取access_token填写client_credential
appid 是 第三方用户唯一凭证
secret 是 第三方用户唯一凭证密钥,既appsecret
返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}
参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

protected $appId = '-------';
protected $appSecret ='---------';
protected function getAccessToken()
{
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        $jsonInfo = json_decode($output, true);
        $this->accessToken = $jsonInfo["access_token"];
 }
  1. 获取jsapi_ticket
    正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存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
}
所以同样用curl:

 protected function getJsApiTicket()
    {
        $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$this->accessToken&type=jsapi";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        $jsonInfo = json_decode($output, true);
        $this->jsApiTicket = $jsonInfo["ticket"];
    }
  1. 签名算法实现
    签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
 protected function getSignPackage()
    {
        // 注意 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=$this->jsApiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $this->signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

4.视图端获取php控制器传过来的数据

<html>
    <head>
        <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
        <script type="text/javascript">
            wx.config({
                debug: false,
                appId: '<?php echo $signPackage["appId"];?>',
                timestamp: <?php echo $signPackage["timestamp"];?>,
                nonceStr: '<?php echo $signPackage["nonceStr"];?>',
                signature: '<?php echo $signPackage["signature"];?>',
                jsApiList: [
                    // 所有要调用的 API 都要加到这个列表中
                    'checkJsApi',
                    'openLocation',
                    'getLocation'
                ]
            });
            wx.ready(function () {
                wx.checkJsApi({
                    jsApiList: [
                        'getLocation'
                    ],
                    success: function (res) {
                        // alert(JSON.stringify(res));
                        // alert(JSON.stringify(res.checkResult.getLocation));
                        if (res.checkResult.getLocation == false) {
                            alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
                            return;
                        }
                    }
                });
                wx.getLocation({
                    success: function (res) {
                        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                        var speed = res.speed; // 速度,以米/每秒计
                        var accuracy = res.accuracy; // 位置精度
                        alert("纬度:"+latitude+"经度:"+longitude+"位置精度:"+accuracy);
                    },
                    cancel: function (res) {
                        alert('用户拒绝授权获取地理位置');
                    }
                });
            });

        </script>
    </head>

    <body>
    <?php echo $signPackage["appId"];?>
    <?php echo $signPackage["timestamp"];?>
    <?php echo $signPackage["nonceStr"];?>
    <?php echo $signPackage["signature"];?>

    </body>
</html>

参考于:http://www.cnblogs.com/txw1958/p/weixin-web-location.html

2019-07-05 15:14:50 ligaoyuan00 阅读数 531
  • 自己开发一套微信支付接口(SDK)-微信开发15(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 边栏可办理会员卡。自己开发一套微信支付接口(SDK)是子恒老师《子恒说微信开发》视频教程的第15部。详细讲解了用php开发一套自己的微信支付接口。内容包含微信支付开发思路,基础类开发,微信支付接口应用,公众号发红包,企业付款等等。欢迎反馈,微信号:QQ68183131

    5400 人正在学习 去看看 秦子恒
import wx from "weixin-jsapi";

 wx.ready(function() {
            if (sessionStorage.getItem("latitude") == null) {
              wx.getLocation({
                type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                success: function(res) {
                  sessionStorage.setItem("latitude", res.latitude);
                  sessionStorage.setItem("longitude", res.longitude);
                  that.latitude = res.latitude;
                  that.longitude = res.longitude;
                },
                cancel: function() {
                  this.$yptylog({
                    title: "alert",
                    content:
                      "您好!由于您拒绝获取地理位置。您无法享受附近的人可以找到您的个人简介信息",
                    ok: function() {
                      window.history.go(-1);
                    }
                  });
                }
                // fail: function(res) {
                //   var u = navigator.userAgent;
                //   // var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
                //   var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
                //   if (isiOS) {
                //     $("#detailmsg").show();
                //   }
                // }
              });
            } else {
              that.latitude = sessionStorage.getItem("latitude");
              that.longitude = sessionStorage.getItem("longitude");
            }
            wx.error(function(res) {
              console.log("wx-js初始化: " + res);
            });
          });

 

没有更多推荐了,返回首页