1 開發條件
1 申請一個微信公眾號,並確認在開發–接口權限中擁有分享功能的權限。
2 公眾號設置–功能設置:在JS接口安全域名中添加安全域名,這個安全域名不是url,只需添加一級域名即可。
3 開發,基本配置中,需要獲得開發者id,開發者密碼,ip白名單,ip白名單是服務器的ip。
4 獲得jsapi_ticket:
先獲取access_token:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
接口調用獲取: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
獲取jsapi_ticket https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
5 signature獲取:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
2 在后台使用動態url方式獲取signature
前台:
$(document).ready(function(){
initPage();
});
function initPage() {
//alert(window.location.href);/***用於獲得當前連接url用**/
/***用戶點擊分享到微信圈后加載接口接口*******/
$.post("/business/businessAction.do?method=getSharData",{"url":location.href.split('#')[0]},function(data,status){
data=eval("("+data+")");
console.log(data);
wx.config({
debug: false,
appId: 'wx071f25226923fc00',
timestamp:data.timestamp,
nonceStr:data.nonceStr,
signature:data.signature,
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'hideOptionMenu',
]
});
wx.ready(function(){
wx.hideOptionMenu();/***隱藏分享菜單****/
});
});
};
后台:
import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
/**
*用來獲得微信驗證的所有參數
*/
public class Sign {
public static void main(String[] args) {
String jsapi_ticket = "bxLdikRXVbTPdHSM05e5u7pfX712TBiu6cLRUR0dNkywjZCMepIQeCTufMFPO6ARKcFQ1B_SkwMCD1MlAS-96Q";
// 注意 URL 一定要動態獲取,不能 hardcode
String url = "http://vip.cioe.cn";
Map<String, String> ret = sign(jsapi_ticket, url);
for (Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
};
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 string1;
String signature = "";
//注意這里參數名必須全部小寫,且必須有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(string1);
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.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);
}
}
3 改為接口進行訪問
@ApiOperation(value = "2.獲取企業微信簽名", notes = "2.獲取企業微信簽名")
@ApiImplicitParams({
@ApiImplicitParam(name = "url", paramType = "query", value = "url" ,required = true)
})
@GetMapping("/getSign")
public ResponseEntity<Map<String, String>> getSign(String url) throws ApiException {
AccessTokenVO accessToken = WeComUtil.getAccessToken();
String access_token = accessToken.getAccess_token();
ResponseEntity<String> forEntity = restTemplate.getForEntity("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + access_token, String.class);
String body = forEntity.getBody();
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(body);
String ticket = jsonObject.getString("ticket");
Map<String, String> sign = Sign.sign(ticket, url);
return new ResponseEntity<>(sign,HttpStatus.OK);
}
@ApiOperation(value = "3.獲取微信公眾號簽名", notes = "3.獲取微信公眾號簽名")
@ApiImplicitParams({
@ApiImplicitParam(name = "url", paramType = "query", value = "url" ,required = true)
})
@GetMapping("/getWechatMpSign")
public ResponseEntity<Map<String, String>> getWechatMpSign(String url) throws ApiException {
AccessTokenVO mpAccessToken = WeChatMpUtil.getMpAccessToken();
String access_token = mpAccessToken.getAccess_token();
ResponseEntity<String> forEntity = restTemplate.getForEntity("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi", String.class);
String body = forEntity.getBody();
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(body);
String ticket = jsonObject.getString("ticket");
Map<String, String> sign = Sign.sign(ticket, url);
return new ResponseEntity<>(sign,HttpStatus.OK);
}