微信jsapi-java初步接入
时间:2015-06-18 00:45:09
收藏:0
阅读:582
【微信公众号对于开发者来说】
接触微信应该比大部分人都早,
记得那会开了微信号,大多数人还不知道什么东东,
微信发展如此迅速,着实很强大。
很多次要开发一些微信公众号的东西,
但是都卡在了“认证”上,
个人不能认证。
【发送给朋友的链接】
今天又遇到问题,想做一个自定义的发送给朋友的链接,
这么简单的功能,耗费了一下午,最后发现原来分享是需要认证的,
坑啊,做下记录,希望对有同样问题的人有帮助。
【java代码】
至于api什么的自己去看吧,虽然比较费劲,但是也不是很难,直接上封装了一部分的代码:
package com.uikoo9.util.external;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.json.JSONObject;
import com.uikoo9.util.core.data.QStringUtil;
import com.uikoo9.util.core.file.QPropertiesUtil;
import com.uikoo9.util.core.http.QHttpClientUtil;
import com.uikoo9.util.function.QCacheUtil;
import com.uikoo9.util.function.QEncodeUtil;
import com.uikoo9.util.function.QThreadUtil;
/**
* 微信工具类
* 1.校验合法性<br>
* 2.获取accesstoken<br>
* 3.获取jsticket<br>
* 4.执行微信线程<br>
* 5.获取jsapi相关参数map<br>
* @author qiaowenbin
* @version 0.0.2.20150617
* @history
* 0.0.2.20150617<br>
* 0.0.1.20150206<br>
*/
public class QWeixinUtil {
/**
* 微信token校验
* @param request
* @param token
* @return
*/
public static String checkToken(HttpServletRequest request, String token){
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
return checkToken(signature, timestamp, nonce, echostr, token);
}
/**
* 微信token校验
* @param signature
* @param timestamp
* @param nonce
* @param echostr
* @param token
* @return
*/
public static String checkToken(String signature, String timestamp, String nonce, String echostr, String token){
if(QStringUtil.allNotEmpty(signature, timestamp, nonce, echostr, token)){
StringBuilder sb = new StringBuilder();
String[] tmp = {token, timestamp, nonce};
Arrays.sort(tmp);
for(String s : tmp){
sb.append(s);
}
String pwd = QEncodeUtil.sha1(sb.toString());
if(signature.equals(pwd)) return echostr;
}
return QStringUtil.emptyStr;
}
/**
* 获取access_token
* @return
*/
public static String getAccessToken(){
try {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + QPropertiesUtil.get("weixin.appid") + "&secret=" + QPropertiesUtil.get("weixin.appsecret");
JSONObject json = new JSONObject(QHttpClientUtil.get(url));
return json.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取jsticket
* @return
*/
public static String getJsTicket(String token){
try {
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi";
JSONObject json = new JSONObject(QHttpClientUtil.get(url));
return json.getString("ticket");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 执行微信线程
*/
public static void runWeixinThread(){
QThreadUtil.runScheduledBySeconds(new Runnable() {
public void run() {
String token = getAccessToken();
QCacheUtil.putToEHCache("weixintoken", token);
QCacheUtil.putToEHCache("weixinjsticket", getJsTicket(token));
}
}, 1, 7100);
}
/**
* 获取jsapi相关参数map
* @param jsapi_ticket
* @param url
* @return
*/
public static Map<String, String> getJsSignMap(String jsapi_ticket, String url) {
Map<String, String> map = new HashMap<String, String>();
String nonce_str = UUID.randomUUID().toString();
String timestamp = Long.toString(System.currentTimeMillis() / 1000);
String s = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url;
String signature = QEncodeUtil.sha1(s);
map.put("url", url);
map.put("jsapi_ticket", jsapi_ticket);
map.put("nonceStr", nonce_str);
map.put("timestamp", timestamp);
map.put("signature", signature);
return map;
}
}
主要分为三块:
1.token的验证
2.缓存accesstoken和jsticket
3.获取js相关参数
对应的配置文件:
# weixin properties weixin.debug=false weixin.token=y weixin.appid=y weixin.appsecret=y
另外在服务启动的时候需要调用:QWeixinUtil.runWeixinThread();
【页面】
跳转到页面的后台代码:
private void initWeixinInfo(BlogArticleModel blog){
String jsTicket = (String) QCacheUtil.getFromEHCache("weixinjsticket");
String url = "http://uikoo9.com/blog/detail/" + blog.getStr("blog_article_code");
Map<String, String> map = QWeixinUtil.getJsSignMap(jsTicket, url);
setAttr("wxdebug", QPropertiesUtil.get("weixin.debug"));
setAttr("wxappid", QPropertiesUtil.get("weixin.appid"));
setAttr("wxtime", map.get("timestamp"));
setAttr("wxrandom", map.get("nonceStr"));
setAttr("wxsign", map.get("signature"));
setAttr("wxtitle", blog.getStr("blog_article_title"));
setAttr("wxurl", map.get("url"));
}
对应页面代码:
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
wx.config({
debug: ${wxdebug},
appId: ‘${wxappid}‘,
timestamp: ${wxtime},
nonceStr: ‘${wxrandom}‘,
signature: ‘${wxsign}‘,
jsApiList: [‘onMenuShareAppMessage‘]
});
wx.ready(function(){
wx.onMenuShareAppMessage({
title: ‘${wxtitle}‘,
desc: ‘${wxtitle}‘,
link: ‘${wxurl}‘,
imgUrl: ‘http://uikoo9.qiniudn.com/@/img/logo.png‘
});
});
/*
trigger: function (res) {
alert(‘用户点击发送给朋友‘);
},
success: function () {
alert(1);
},
cancel: function () {
alert(2);
},
fail: function (res) {
alert(JSON.stringify(res));
}
wx.error(function(res){
alert(JSON.stringify(res));
});
*/
</script>
【几点注意】
按上面的配置基本就可以了,需要注意几点:
1.善用wx.error,这个可以用来调试错误
2.善用wx.config中的debug:true,也是调试,感觉没有上面的有用
【坑爹的认证】
打开wx.error如果这个时候你看到的是:

那么恭喜你,你成功了,
但是如果,点击发送给朋友还是没有自定义,那么恭喜你,
这个问题会纠结很久,
最后的最后我告诉你,因为没有进行微信认证,所以和“分享”有关的你都没有权限。
而微信的认证个人是不能认证的,去注册个公司吧~~
【更多】
更多精彩内容:uikoo9.com
评论(0)