微信JSSDK开发JAVA版实现
来源:互联网 发布:php pack函数 编辑:程序博客网 时间:2024/05/21 11:05
JSSDK JAVA开发第一步:绑定域名
先登录微信公众平台进入“公众号设置”(作者:在页面左下角,认证订阅号,认证服务号皆可配置)
(备注:登录后可在“开发者中心”可查看对应的接口权限。)
再选择页面上方“功能设置”
这时可以看到“JS接口安全域名”。点击设置弹出以下输入框,按照要求填写域名(注意:IP不可用)
如:www.ipastimes.com, ipastimes.com, examples.ipastimes.com 可用
JSSDK JAVA开发第二步:引入微信JS
在需要引用微信JS接口的页面引入微信js文件(微信在其浏览器内置wx对象)http://res.wx.qq.com/open/js/jweixin-1.0.0.js
JSSDK JAVA开发第三步:后台实现签名逻辑
1.获取access_token
/**
* 获取接口访问凭证
*
* @param appid 凭证
* @param appsecret 密钥
* @return
*/
public
static
String getAccess_token(String appid, String appsecret) {
//凭证获取(GET)
String token_url =
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"
;
String requestUrl = token_url.replace(
"APPID"
, appid).replace(
"APPSECRET"
, appsecret);
// 发起GET请求获取凭证
JSONObject jsonObject = httpsRequest(requestUrl,
"GET"
,
null
);
String access_token =
null
;
if
(
null
!= jsonObject) {
try
{
access_token = jsonObject.getString(
"access_token"
);
}
catch
(JSONException e) {
// 获取token失败
log.error(
"获取token失败 errcode:{} errmsg:{}"
, jsonObject.getInt(
"errcode"
), jsonObject.getString(
"errmsg"
));
}
}
return
access_token;
}
2.获取jsapi_ticket
/**
* 调用微信JS接口的临时票据
*
* @param access_token 接口访问凭证
* @return
*/
public
static
String getJsApiTicket(String access_token) {
String url =
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"
;
String requestUrl = url.replace(
"ACCESS_TOKEN"
, access_token);
// 发起GET请求获取凭证
JSONObject jsonObject = httpsRequest(requestUrl,
"GET"
,
null
);
String ticket =
null
;
if
(
null
!= jsonObject) {
try
{
ticket = jsonObject.getString(
"ticket"
);
}
catch
(JSONException e) {
// 获取token失败
log.error(
"获取token失败 errcode:{} errmsg:{}"
, jsonObject.getInt(
"errcode"
), jsonObject.getString(
"errmsg"
));
}
}
return
ticket;
}
3.实现签名逻辑(根据官方sample改)
import
java.io.UnsupportedEncodingException;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Formatter;
import
java.util.HashMap;
import
java.util.Map;
import
java.util.UUID;
import
javax.servlet.http.HttpServletRequest;
import
net.sf.json.JSONObject;
import
org.apache.struts2.ServletActionContext;
public
class
PastUtil {
public
static
Token token =
null
;
public
static
String time =
null
;
public
static
String jsapi_ticket =
null
;
/**
*
* @param appId 公账号appId
* @param appSecret
* @param url 当前网页的URL,不包含#及其后面部分
* @return
*/
public
static
String getParam(String appId,String appSecret){
if
(token ==
null
){
token = CommonUtil.getToken(appId, appSecret);
jsapi_ticket = CommonUtil.getJsApiTicket(token.getAccessToken());
time = getTime();
}
else
{
if
(!time.substring(
0
,
13
).equals(getTime().substring(
0
,
13
))){
//每小时刷新一次
token =
null
;
token = CommonUtil.getToken(appId, appSecret);
jsapi_ticket = CommonUtil.getJsApiTicket(token.getAccessToken());
time = getTime();
}
}
String url = getUrl();
Map<String, String> params = sign(jsapi_ticket, url);
params.put(
"appid"
, appId);
JSONObject jsonObject = JSONObject.fromObject(params);
String jsonStr = jsonObject.toString();
System.out.println(jsonStr);
return
jsonStr;
}
private
static
String getUrl(){
HttpServletRequest request = ServletActionContext.getRequest();
StringBuffer requestUrl = request.getRequestURL();
String queryString = request.getQueryString();
String url = requestUrl +
"?"
+queryString;
return
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);
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);
}
}
大部分开发者在签名认证处出错,开启debug模式,当进入页面时会alert出如下信息:
按照如下步骤排错:
1.确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
2.确认config中noncestr, timestamp与用以签名中的对应noncestr, timestamp一致。
3.确认url是页面完整的url,包括GET参数部分。
4.确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
5.确保一定缓存access_token和jsapi_ticket,可以减少两次服务器请求加速体验外,还避免了触发频率限制,提高服务稳定性。
附JS SDK权限表
更多信息请参考:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
- 微信JSSDK开发JAVA版实现
- 微信JSSDK开发JAVA版实现
- java微信jssdk开发
- 微信:JSSDK开发
- 微信jssdk开发
- 微信JSSDK自定义分享Java版
- 微信JSSDK开发,调用微信扫一扫 JAVA & jsp前端 & js实现
- 微信开发之JSSDK接口开发(Java)
- 微信JSSDK引入微信开发
- 公众号jssdk开发实例,微信jssdk开发demo
- 微信 JSSDK .NET版
- 微信jssdk分享开发经验
- 微信jssdk录音功能开发记录
- 微信jssdk录音功能开发记录
- 微信开发之JSSDK调用
- 微信JSSDK开发信息配置
- 微信开发调用JSSDK 扫一扫功能
- 微信jssdk录音功能开发记录
- 【ZOJ3921 2016年浙大2月月赛I】【物理题 底乘高积分式思维】In the Rain 圆柱体人行走 吸收雨体积
- 安卓 与h5的交互的一点点分享
- 文档读取每一个字符——尤其是空格
- Java 8读取Access数据库报错的问题——用32位Java 7
- 39.layoutSubviews和drawRect调用时机的探究
- 微信JSSDK开发JAVA版实现
- Java关键字final、static使用总结
- Android.mk里添加 LOCAL_SDK_VERSION := current 后不能使用@hide API
- Android项目:手机安全卫士(4)—— 自定义(组合)控件、属性
- 依赖倒置原则
- [Andriod Monkey测试] Monkey基本参数与事件参数
- Sqoop1.99.6安装遇到的问题
- 记录yii resetful 自定义action是,设置它的请求方式
- 规范返回json格式