您的位置:首页 > 移动开发 > 微信开发

JAVA版 微信企业号开发 个人总结(微信网页授权例子,微信企业号精准定位,误差5-10米)

2017-03-16 12:17 495 查看
总路线

主要内容:案例微信网页授权,企业号精准定位(误差5-10米)

一、 access_token获取

二、 获取js-sdk的权限,票据jsapi_ticket

三、js-sdk的signature

四、js-sdk前台配置,获取精准的经纬度

五、额外附加 java定时器

一、 access_token获取

原理:获取公众号的corpid和corpsecret,对https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret进行get请求,返回获取access_token,注意access_token的有效时间为7200秒,而请求access_token的次数是有限的,需要用定时器定时获取(后续讲述定时器,也可以用其他方法代替)

/**
* http GET请求封装
*
* @param url
* @return
*/
public static JSONObject doGet(String url) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
JSONObject obj = new JSONObject();
try {
HttpResponse response = httpClient.execute(get);
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "utf-8");
obj = JSONObject.parseObject(result);
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}

/**
* 获取accesstoken,保存access_token
*
* @return
*/
public static String getToken() {
String access_token = "";
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret";
JSONObject obj = doGet(url);
if (obj != null) {
access_token = obj.getString("access_token");
//这里进行数据存储accesstoken或者全局缓存accesstoken
//---------
//----------
}
return access_token;
}


二、 获取js-sdk的权限,票据jsapi_ticket

原理,通过access_token来换取jsapi_ticket

/**
* 获取js-sdk的权限,票据ticket
*
* @return
*/
public static String ticket() {
String access_token = getToken();// 建议从数据库中获取,或者全局缓存中获取,这只是个本地的例子
JSONObject obj1 = doGet("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + access_token);
if (obj1 != null) {
String jsapi_ticket = obj1.getString("ticket");// 全局缓存jsapi_ticket
//这里进行数据存储jsapi_ticket或者全局缓存jsapi_ticket
//---------
//----------
return jsapi_ticket;
}
return "fail";
}


三、js-sdk的signature

(后台)原理,java后台进行signature(主要进行sha1加密)

后台进行sha1加密,用json格式返回前端,然前端进行处理

/**
* 按照固定的排序方式进行sha1加密
*
* @param url
*            传递进来的url参数
* @return
*/
public static JSONObject signature(String url) {
JSONObject obj = new JSONObject();
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddhh"); // 时间戳格式化,必须取10位
String timestamp = sdFormat.format(new Date());// 当前时间戳
String noncestr = getRandom(9);// 9位随机数
String signature = "jsapi_ticket=" + WxUtil.ticket();// 获取数据
signature += "&" + "noncestr=" + noncestr;
signature += "&" + "timestamp=" + timestamp;
signature += "&" + "url=" + url;
signature = SHA1(signature);
obj.put("timestamp", timestamp);
obj.put("signature", signature);
obj.put("noncestr", noncestr);
System.out.println("\n" + obj);
return obj;
}

/**
* @description: SHA、SHA1加密方法 @parameter: str:待加密字符串 @return: 加密串
**/
public static String SHA1(String str) {
try {
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); // 如果是SHA加密只需要将"SHA-1"改成"SHA"即可
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexStr = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexStr.append(0);
}
hexStr.append(shaHex);
}
return hexStr.toString();

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}

/**
* 生成一定位数的随机数
*
* @param length
* @return
*/
public static String getRandom(int length) {
String allChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++)
sb.append(allChar.charAt(random.nextInt(allChar.length())));

return sb.toString();
}


四、js-sdk前台配置,获取精准的经纬度

前台,用js进行微信js-sdk的配置

原理:ajax获取wx.config所需要的配置信息,配置成功后进行使用微信自带的定位功能获取经纬度,然后把获得的经纬度通过百度地图的坐标转换api的接口,从而获得在百度地图上获得比较精准的地理位置

执行顺序

wx.config>wx.ready

注意:js中的代码,注意必须先引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.1.0.js 和jq文件

var flag = false;
var long = '';
var lat = '';
wx.ready(function() {
getLocation();
});

function signature() {
$.ajax({
url: '9',
data: { 'url': "当前页面url,不包括url#后面的"},
type: "get",
dataType: 'json',
success: function(data) {
// 可以参考微信企业号开发平台的js-sdk文档
wx.config({
appId: '你的cropid', // 必填,公众号的唯一标识
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.noncestr, // 必填,生成签名的随机串
signature: data.signature, //必填,签名
jsApiList: ['openLocation', 'getLocation', 'chooseImage', 'uploadImage'] // 必填,需要使用的JS接口列表
});
flag = true;
},
error: function(data) {
alert('fail');
}
});
}
//使用微信自带的定位
function getLocation() {
if(flag) {

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; // 位置精度
changeLocation(longitude, latitude);
}
});
} else {
alert("flag not true");
signature();
getLocation();
}

}
//坐标转换API,Web服务API(百度api)
function changeLocation(Long, Lat) {
$.ajax({
url: "http://api.map.baidu.com/geoconv/v1/?coords=" + Long + "," + Lat + "&from=1&to=5&ak=你的密钥",
type: "get",
dataType: 'jsonp',
success: function(data) {
long = data.result[0].x;
lat = data.result[0].y;
//chooseImg();
},
error: function(data) {
alert('fail');
}
});
}


五、额外附加 定时器

配置xml文件

使用注解进行定时调度,注意cron是时间

@Component
public class TimeTask {
/**
*
* 秒 0-59 , - * /
* 分 0-59 , - * /
* 小时 0-23 , - * /
* 日期 1-31 , - * ? / L W C
* 月份 1-12 或者 JAN-DEC , - * /
* 星期 1-7 或者 SUN-SAT , - * ? / L C #
* 年(可选)留空, 1970-2099 , - * /
* cron = "0 0 0/1 * * ?"相当于每小时进行一次操作
* @throws Exception
*/

@Scheduled(cron = "0 0 0/1 * * ?")
public void task() throws Exception {
System.out.println("---------------------task start--------------------");
//调用你的获取access_token的方法,调用你的获取jsapi_ticket的方法

System.out.println("---------------------task end--------------------");
}
}


相关xml的配置



相关代码:

<beans xmlns:task="http://www.springframework.org/schema/task"

xsi:schemaLocation=http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"> 
<!-- 设置定时任务 -->
<task:annotation-driven/>
</beans>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 微信 企业