- 在刚开始写关于微信jsapi的时候可以说是一窍不通
- 资源又少幸好最终有笨笨大神帮忙终于搞定了
- 于是我果断上传微博希望对大家开发微信有帮助
微信开发API文档是必看的
在api文档里面我们可以看到很多内容,然后需要我们去理解点击进微信硬件平台api[http://iot.weixin.qq.com/wiki/new/index.html?page=4-7.
例如
解绑设备 需要:
字段 | 是否必须 | 描述 |
---|---|---|
access_token | 是 | 调用接口凭证 |
ticket | 是 | 绑定操作合法性的凭证(由微信后台生成,第三方H5通过客户端jsapi获得) |
device_id | 是 | 设备id |
openid | 是 | 用户对应的openid使用冒号来定义对齐方式 |
关于解绑设备里面的ticket 就是很关键的一个值了:
还是直接上代码吧!
页面代码块
代码块语法遵循标准markdown代码:
<html>
<script type="text/javascript"
src="${pageContext.request.contextPath}/js/jquery-1.2.6.pack.js">
</script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js">
</script>
<button class="className" onclick="del()">解绑设备</button>
<script type="text/javascript">
var deviceId = "gh_62d23d084569_ced3197c64e6ce17";//设备ID测试可以先写死
//alert(location.href.split('#')[0]);//得到页面的地址用于后台的link
//config接口权限配置 这里在文档是有清晰的解释
wx.config( {
//都是从后台传过来的值
beta : true, // 开启内测接口调用,注入wx.invoke方法必填
debug : true, // 开启调试模式 必填
appId : '${config.appId}', // 第三方app唯一标识必填
timestamp : '${config.timestamp}', // 签名的时间戳必填
nonceStr : '${config.nonce}', // 生成签名的随机串必填
signature : '${config.signature}',//签名 必填
jsApiList : [
//添加使用的函数
'openWXDeviceLib', 'getWXDeviceTicket' ]
});
//ready权限验证
wx.ready(function() {
wx.invoke('openWXDeviceLib', {}, function(res) {
//alert(res.err_msg + "唯一");
});
});
wx.error(function(res) {
//alert("我是wx.error");
});
//删除
function del() {
if (confirm("确定要删除吗?") == false) {
return false;
} else {
//获取的凭证
wx.invoke('getWXDeviceTicket',{"deviceId" : deviceId,"type" : 2},function(res) {
var ticket = res.ticket //就是要获取的凭证就是上面我说的解绑ticket值了
alert(ticket + "获取的凭证了嘛");
var url = "${pageContext.request.contextPath}/know.do?method=jiechu";//这里用ajax传到后台进行解绑操作
$.post(url, {ticket : ticket}, function(data) {
if (data != null) {
alert(ticket + "true");
alert("解绑成功");
}
});
});
}
}
</script>
</html>
后台代码块
代码块语法遵循标准markdown代码:
/**
* 带签名等参数进解绑页面
*
* @throws Exception
*/
@RequestMapping(params = "method=unBind")
public String unBind() throws Exception {
JsAPIConfig config = Ticket
.createConfig("http://upanupanupan.gicp.net/demo/sports.do?method=unBind");//得到解绑页面的地址
request.setAttribute("config", config);
return "/Unbound.jsp";
}
/**
* 获取jsTicket
*
* @throws
*/
public static String getTicket() {
String ticket = null;
// 有效期为7200秒
String access_token = AccessTokenUtil.getTokenStr();
System.out.println("得到access_token值:" + access_token);
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
+ access_token + "&type=jsapi";
try {
HttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = client.execute(httpget, responseHandler);
JSONObject userJSONO = JSONObject.fromObject(response);
ticket = String.valueOf(userJSONO.get("ticket"));
System.out.println("得到ticket值为::" + ticket);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ticket;
}
/**
* 生成JsAPIConfig 得到页面需要参数
*
* @Title: createConfig
n: TODO
* @param @param link 使用的AirKiss 链接地址
* @param @return
* @param @throws Exception
* @return JsAPIConfig
* @throws
*/
public static JsAPIConfig createConfig(String link) throws Exception {
JsAPIConfig config = new JsAPIConfig();
config.setLink(link);//得到页面地址
String nonce = UUID.randomUUID().toString();//得到生成签名的随机串
String timestamp = Long.toString(System.currentTimeMillis() / 1000);//得到时间戳
String src = "jsapi_ticket=" + Ticket.getTicket() + "&noncestr="
+ nonce + "×tamp=" + timestamp + "&url="
+ config.getLink();
String signature = SHA1.sha1(src);//根据以上的值得到签名
String appId = WxConfig.APPID;
config.setAppId(appId);
config.setDebug(true);
config.setNonce(nonce);
config.setTimestamp(timestamp);
config.setSignature(signature);
System.out.println(config.getAppId() + "AppId来");
System.out.println(config.getLink() + "Link来");
System.out.println(config.getNonce() + "Nonce来");
System.out.println(config.getTimestamp() + "Timestamp来");
return config;
}
/**
* 排序并生成加密SHA1签名
*/
public static String sha1(String src) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(src.getBytes());
return byteToStr(digest);
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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;
}
//这里新建一个类,个人较懒就放在一起了
package com.bluelight.demo.util;
/**
* 服务器端http请求工具类
*/
public class JsAPIConfig {
private boolean debug;
private String appId;
private String timestamp;
private String nonce;
private String signature;
private String title;
private String link;
private String signType;
private String packageName;
public JsAPIConfig() {
signType = "MD5";
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getSignType() {
return signType;
}
public void setSignType(String signType) {
this.signType = signType;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
}
不懂可以去看文档或者找其他资料,或者加qq群(93472007)
目录
用 [TOC]
来生成目录: