微信分享朋友分享朋友圈
1.准备工作
1.1.获取微信公众号的appid 和 密钥
1.2公众号设置中添加js安全域名,需要将文件放在默认的80端口下。可做映射,可更改tomcat配置
1.2.1端口映射
一 .添加映射将80端口映射到8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
二. 删除映射(不需要时删除)
查看映射编号 iptables -t nat -L -nv --line-numbers
删除项 “num” 对应的字母 iptables -t nat -D PREROUTING “num(实际上是对应的数字)”
2.后台操作
2.1后台获取需要获取签名的url
package com.weifeng.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import static com.weifeng.utils.Duck.weixinSign;
@RestController
@CrossOrigin
public class WechatController {
//获取签名参数
@GetMapping("weiSign")
public Map<String, Object> weiSign( String url){
System.out.println("url = " + url);
//请求方法
return weixinSign(url);
}
}
获取签名需要先获取token 和 ticket
package com.weifeng.utils;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class Duck {
public static Map<String, Object> weixinSign(String url1) {
String json = "";
String token = "";
String ticket = "";
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.ping();
Map<String,String> params = new HashMap<>();
params.put("grant_type","client_credential");
params.put("appid","你自己的appid");
params.put("secret","你自己的密钥");
if (jedis.exists("token")){
token=jedis.get("token");
}else {
json = HttpClientUtil.doGet("https://api.weixin.qq.com/cgi-bin/token?",params);
JSONObject jsonObject = JSONObject.parseObject(json);
token=jsonObject.get("access_token").toString();
System.out.println("token = " + token);
jedis.setex("token",7200,token);
}
if (jedis.exists("weixinticket")){
ticket = jedis.get("weixinticket");
}else {
String TUrl ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?";
HashMap<String, String> paramHashMap = new HashMap<>();
paramHashMap.put("type","jsapi");
paramHashMap.put("access_token",token);
json = HttpClientUtil.doGet(TUrl,paramHashMap);
System.out.println("json = " + json);
JSONObject tickObject = JSONObject.parseObject(json);
ticket=tickObject.get("ticket").toString();
System.out.println(ticket);
jedis.setex("weixinticket", 7200,ticket);
}
//调用获取签名方法
Map<String, Object> sign = WeiXinSign.sign(ticket, url1);
System.out.println("签名为"+sign);
return sign;
}
}
获取签名的方法返回签名相关所有的信息
package com.weifeng.utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class WeiXinSign {
public WeiXinSign() {
}
public static Map<String, Object> sign(String jsapi_ticket, String url) {
System.out.println(url);
Map<String, Object> ret = new HashMap();
String nonce_str = create_nonce_str();//不带斜杠的uuid
String timestamp = create_timestamp();//当前时间
String signature = "";
String jieguo = "";
ArrayList<String> arr = new ArrayList();
arr.add("jsapi_ticket=" + jsapi_ticket);
arr.add("noncestr=" + nonce_str);
arr.add("timestamp=" + timestamp);
arr.add("url=" + url);
Collections.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
String str1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");
String str2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");
return str1.compareTo(str2);
} catch (UnsupportedEncodingException var4) {
var4.printStackTrace();
return 0;
}
}
});
for(int i = 0; i < arr.size(); ++i) {
if (i < arr.size() - 1) {
jieguo = jieguo + (String)arr.get(i) + "&";
}
if (i == arr.size() - 1) {
jieguo = jieguo + (String)arr.get(i);
}
}
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
System.out.println("jieguo = " + jieguo);
crypt.update(jieguo.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException var9) {
var9.printStackTrace();
} catch (UnsupportedEncodingException var10) {
var10.printStackTrace();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", Long.parseLong(timestamp));
ret.put("signature", signature);
return ret;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
byte[] var2 = hash;
int var3 = hash.length;
for(int var4 = 0; var4 < var3; ++var4) {
byte b = var2[var4];
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private static String create_nonce_str() {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
return uuid;
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000L);
}
}
3.前端操作
3.1获取官方的js模板
!
function(e, n) {
"function" == typeof define && (define.amd || define.cmd) ? define(function() {
return n(e)
}) : n(e, !0)
} (this,
function(e, n) {
function i(n, i, t) {
e.WeixinJSBridge ? WeixinJSBridge.invoke(n, o(i),
function(e) {
c(n, e, t)
}) : u(n, t)
}
function t(n, i, t) {
e.WeixinJSBridge ? WeixinJSBridge.on(n,
function(e) {
t && t.trigger && t.trigger(e),
c(n, e, i)
}) : t ? u(n, t) : u(n, i)
}
function o(e) {
return e = e || {},
e.appId = C.appId,
e.verifyAppId = C.appId,
e.verifySignType = "sha1",
e.verifyTimestamp = C.timestamp + "",
e.verifyNonceStr = C.nonceStr,
e.verifySignature = C.signature,
e
}
function r(e) {
return {
timeStamp: e.timestamp + "",
nonceStr: e.nonceStr,
package: e.package,
paySign: e.paySign,
signType: e.signType || "SHA1"
}
}
function a(e) {
return e.postalCode = e.addressPostalCode,
delete e.addressPostalCode,
e.provinceName = e.proviceFirstStageName,
delete e.proviceFirstStageName,
e.cityName = e.addressCitySecondStageName,
delete e.addressCitySecondStageName,
e.countryName = e.addressCountiesThirdStageName,
delete e.addressCountiesThirdStageName,
e.detailInfo = e.addressDetailInfo,
delete e.addressDetailInfo,
e
}
function c(e, n, i) {
"openEnterpriseChat" == e && (n.errCode = n.err_code),
delete n.err_code,
delete n.err_desc,
delete n.err_detail;
var t = n.errMsg;
t || (t = n.err_msg, delete n.err_msg, t = s(e, t), n.errMsg = t),
(i = i || {})._complete && (i._complete(n), delete i._complete),
t = n.errMsg || "",
C.debug && !i.isInnerInvoke && alert(JSON.stringify(n));
var o = t.indexOf(":");
switch (t.substring(o + 1)) {
case "ok":
i.success && i.success(n);
break;
case "cancel":
i.cancel && i.cancel(n);
break;
default:
i.fail && i.fail(n)
}
i.complete && i.complete(n)
}
function s(e, n) {
var i = e,
t = v[i];
t && (i = t);
var o = "ok";
if (n) {
var r = n.indexOf(":");
"confirm" == (o = n.substring(r + 1)) && (o = "ok"),
"failed" == o && (o = "fail"),
-1 != o.indexOf("failed_") && (o = o.substring(7)),
-1 != o.indexOf("fail_") && (o = o.substring(5)),
"access denied" != (o = (o = o.replace(/_/g, " ")).toLowerCase()) && "no permission to execute" != o || (o = "permission denied"),
"config" == i && "function not exist" == o && (o = "ok"),
"" == o && (o = "fail")
}
return n = i + ":" + o
}
function d(e) {
if (e) {
for (var n = 0,
i = e.length; n < i; ++n) {
var t = e[n],
o = h[t];
o && (e[n] = o)
}
return e
}
}
function u(e, n) {
if (! (!C.debug || n && n.isInnerInvoke)) {
var i = v[e];
i && (e = i),
n && n._complete && delete n._complete,
console.log('"' + e + '",', n || "")
}
}
function l(e) {
if (! (k || w || C.debug || x < "6.0.2" || V.systemType < 0)) {
var n = new Image;
V.appId = C.appId,
V.initTime = A.initEndTime - A.initStartTime,
V.preVerifyTime = A.preVerifyEndTime - A.preVerifyStartTime,
N.getNetworkType({
isInnerInvoke: !0,
success: function(e) {
V.networkType = e.networkType;
var i = "https://open.weixin.qq.com/sdk/report?v=" + V.version + "&o=" + V.isPreVerifyOk + "&s=" + V.systemType + "&c=" + V.clientVersion + "&a=" + V.appId + "&n=" + V.networkType + "&i=" + V.initTime + "&p=" + V.preVerifyTime + "&u=" + V.url;
n.src = i
}
})
}
}
function p() {
return (new Date).getTime()
}
function f(n) {
T && (e.WeixinJSBridge ? n() : S.addEventListener && S.addEventListener("WeixinJSBridgeReady", n, !1))
}
function m() {
N.invoke || (N.invoke = function(n, i, t) {
e.WeixinJSBridge && WeixinJSBridge.invoke(n, o(i), t)
},
N.on = function(n, i) {
e.WeixinJSBridge && WeixinJSBridge.on(n, i)
})
}
function g(e) {
if ("string" == typeof e && e.length > 0) {
var n = e.split("?")[0],
i = e.split("?")[1];
return n += ".html",
void 0 !== i ? n + "?" + i: n
}
}
if (!e.jWeixin) {
var h = {
config: "preVerifyJSAPI",
onMenuShareTimeline: "menu:share:timeline",
onMenuShareAppMessage: "menu:share:appmessage",
onMenuShareQQ: "menu:share:qq",
onMenuShareWeibo: "menu:share:weiboApp",
onMenuShareQZone: "menu:share:QZone",
previewImage: "imagePreview",
getLocation: "geoLocation",
openProductSpecificView: "openProductViewWithPid",
addCard: "batchAddCard",
openCard: "batchViewCard",
chooseWXPay: "getBrandWCPayRequest",
openEnterpriseRedPacket: "getRecevieBizHongBaoRequest",
startSearchBeacons: "startMonitoringBeacons",
stopSearchBeacons: "stopMonitoringBeacons",
onSearchBeacons: "onBeaconsInRange",
consumeAndShareCard: "consumedShareCard",
openAddress: "editAddress"
},
v = function() {
var e = {};
for (var n in h) e[h[n]] = n;
return e
} (),
S = e.document,
I = S.title,
y = navigator.userAgent.toLowerCase(),
_ = navigator.platform.toLowerCase(),
k = !(!_.match("mac") && !_.match("win")),
w = -1 != y.indexOf("wxdebugger"),
T = -1 != y.indexOf("micromessenger"),
M = -1 != y.indexOf("android"),
P = -1 != y.indexOf("iphone") || -1 != y.indexOf("ipad"),
x = function() {
var e = y.match(/micromessenger\/(\d+\.\d+\.\d+)/) || y.match(/micromessenger\/(\d+\.\d+)/);
return e ? e[1] : ""
} (),
A = {
initStartTime: p(),
initEndTime: 0,
preVerifyStartTime: 0,
preVerifyEndTime: 0
},
V = {
version: 1,
appId: "",
initTime: 0,
preVerifyTime: 0,
networkType: "",
isPreVerifyOk: 1,
systemType: P ? 1 : M ? 2 : -1,
clientVersion: x,
url: encodeURIComponent(location.href)
},
C = {},
L = {
_completes: []
},
B = {
state: 0,
data: {}
};
f(function() {
A.initEndTime = p()
});
var O = !1,
E = [],
N = {
config: function(e) {
C = e,
u("config", e);
var n = !1 !== C.check;
f(function() {
if (n) i(h.config, {
verifyJsApiList: d(C.jsApiList)
},
function() {
L._complete = function(e) {
A.preVerifyEndTime = p(),
B.state = 1,
B.data = e
},
L.success = function(e) {
V.isPreVerifyOk = 0
},
L.fail = function(e) {
L._fail ? L._fail(e) : B.state = -1
};
var e = L._completes;
return e.push(function() {
l()
}),
L.complete = function(n) {
for (var i = 0,
t = e.length; i < t; ++i) e[i]();
L._completes = []
},
L
} ()),
A.preVerifyStartTime = p();
else {
B.state = 1;
for (var e = L._completes,
t = 0,
o = e.length; t < o; ++t) e[t]();
L._completes = []
}
}),
m()
},
ready: function(e) {
0 != B.state ? e() : (L._completes.push(e), !T && C.debug && e())
},
error: function(e) {
x < "6.0.2" || ( - 1 == B.state ? e(B.data) : L._fail = e)
},
checkJsApi: function(e) {
var n = function(e) {
var n = e.checkResult;
for (var i in n) {
var t = v[i];
t && (n[t] = n[i], delete n[i])
}
return e
};
i("checkJsApi", {
jsApiList: d(e.jsApiList)
},
(e._complete = function(e) {
if (M) {
var i = e.checkResult;
i && (e.checkResult = JSON.parse(i))
}
e = n(e)
},
e))
},
onMenuShareTimeline: function(e) {
t(h.onMenuShareTimeline, {
complete: function() {
i("shareTimeline", {
title: e.title || I,
desc: e.title || I,
img_url: e.imgUrl || "",
link: e.link || location.href,
type: e.type || "link",
data_url: e.dataUrl || ""
},
e)
}
},
e)
},
onMenuShareAppMessage: function(e) {
t(h.onMenuShareAppMessage, {
complete: function(n) {
"favorite" === n.scene ? i("sendAppMessage", {
title: e.title || I,
desc: e.desc || "",
link: e.link || location.href,
img_url: e.imgUrl || "",
type: e.type || "link",
data_url: e.dataUrl || ""
}) : i("sendAppMessage", {
title: e.title || I,
desc: e.desc || "",
link: e.link || location.href,
img_url: e.imgUrl || "",
type: e.type || "link",
data_url: e.dataUrl || ""
},
e)
}
},
e)
},
onMenuShareQQ: function(e) {
t(h.onMenuShareQQ, {
complete: function() {
i("shareQQ", {
title: e.title || I,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e)
}
},
e)
},
onMenuShareWeibo: function(e) {
t(h.onMenuShareWeibo, {
complete: function() {
i("shareWeiboApp", {
title: e.title || I,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e)
}
},
e)
},
onMenuShareQZone: function(e) {
t(h.onMenuShareQZone, {
complete: function() {
i("shareQZone", {
title: e.title || I,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e)
}
},
e)
},
updateTimelineShareData: function(e) {
i("updateTimelineShareData", {
title: e.title,
link: e.link,
imgUrl: e.imgUrl
},
e)
},
updateAppMessageShareData: function(e) {
i("updateAppMessageShareData", {
title: e.title,
desc: e.desc,
link: e.link,
imgUrl: e.imgUrl
},
e)
},
startRecord: function(e) {
i("startRecord", {},
e)
},
stopRecord: function(e) {
i("stopRecord", {},
e)
},
onVoiceRecordEnd: function(e) {
t("onVoiceRecordEnd", e)
},
playVoice: function(e) {
i("playVoice", {
localId: e.localId
},
e)
},
pauseVoice: function(e) {
i("pauseVoice", {
localId: e.localId
},
e)
},
stopVoice: function(e) {
i("stopVoice", {
localId: e.localId
},
e)
},
onVoicePlayEnd: function(e) {
t("onVoicePlayEnd", e)
},
uploadVoice: function(e) {
i("uploadVoice", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e)
},
downloadVoice: function(e) {
i("downloadVoice", {
serverId: e.serverId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e)
},
translateVoice: function(e) {
i("translateVoice", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e)
},
chooseImage: function(e) {
i("chooseImage", {
scene: "1|2",
count: e.count || 9,
sizeType: e.sizeType || ["original", "compressed"],
sourceType: e.sourceType || ["album", "camera"]
},
(e._complete = function(e) {
if (M) {
var n = e.localIds;
try {
n && (e.localIds = JSON.parse(n))
} catch(e) {}
}
},
e))
},
getLocation: function(e) {},
previewImage: function(e) {
i(h.previewImage, {
current: e.current,
urls: e.urls
},
e)
},
uploadImage: function(e) {
i("uploadImage", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e)
},
downloadImage: function(e) {
i("downloadImage", {
serverId: e.serverId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e)
},
getLocalImgData: function(e) { ! 1 === O ? (O = !0, i("getLocalImgData", {
localId: e.localId
},
(e._complete = function(e) {
if (O = !1, E.length > 0) {
var n = E.shift();
wx.getLocalImgData(n)
}
},
e))) : E.push(e)
},
getNetworkType: function(e) {
var n = function(e) {
var n = e.errMsg;
e.errMsg = "getNetworkType:ok";
var i = e.subtype;
if (delete e.subtype, i) e.networkType = i;
else {
var t = n.indexOf(":"),
o = n.substring(t + 1);
switch (o) {
case "wifi":
case "edge":
case "wwan":
e.networkType = o;
break;
default:
e.errMsg = "getNetworkType:fail"
}
}
return e
};
i("getNetworkType", {},
(e._complete = function(e) {
e = n(e)
},
e))
},
openLocation: function(e) {
i("openLocation", {
latitude: e.latitude,
longitude: e.longitude,
name: e.name || "",
address: e.address || "",
scale: e.scale || 28,
infoUrl: e.infoUrl || ""
},
e)
},
getLocation: function(e) {
e = e || {},
i(h.getLocation, {
type: e.type || "wgs84"
},
(e._complete = function(e) {
delete e.type
},
e))
},
hideOptionMenu: function(e) {
i("hideOptionMenu", {},
e)
},
showOptionMenu: function(e) {
i("showOptionMenu", {},
e)
},
closeWindow: function(e) {
i("closeWindow", {},
e = e || {})
},
hideMenuItems: function(e) {
i("hideMenuItems", {
menuList: e.menuList
},
e)
},
showMenuItems: function(e) {
i("showMenuItems", {
menuList: e.menuList
},
e)
},
hideAllNonBaseMenuItem: function(e) {
i("hideAllNonBaseMenuItem", {},
e)
},
showAllNonBaseMenuItem: function(e) {
i("showAllNonBaseMenuItem", {},
e)
},
scanQRCode: function(e) {
i("scanQRCode", {
needResult: (e = e || {}).needResult || 0,
scanType: e.scanType || ["qrCode", "barCode"]
},
(e._complete = function(e) {
if (P) {
var n = e.resultStr;
if (n) {
var i = JSON.parse(n);
e.resultStr = i && i.scan_code && i.scan_code.scan_result
}
}
},
e))
},
openAddress: function(e) {
i(h.openAddress, {},
(e._complete = function(e) {
e = a(e)
},
e))
},
openProductSpecificView: function(e) {
i(h.openProductSpecificView, {
pid: e.productId,
view_type: e.viewType || 0,
ext_info: e.extInfo
},
e)
},
addCard: function(e) {
for (var n = e.cardList,
t = [], o = 0, r = n.length; o < r; ++o) {
var a = n[o],
c = {
card_id: a.cardId,
card_ext: a.cardExt
};
t.push(c)
}
i(h.addCard, {
card_list: t
},
(e._complete = function(e) {
var n = e.card_list;
if (n) {
for (var i = 0,
t = (n = JSON.parse(n)).length; i < t; ++i) {
var o = n[i];
o.cardId = o.card_id,
o.cardExt = o.card_ext,
o.isSuccess = !!o.is_succ,
delete o.card_id,
delete o.card_ext,
delete o.is_succ
}
e.cardList = n,
delete e.card_list
}
},
e))
},
chooseCard: function(e) {
i("chooseCard", {
app_id: C.appId,
location_id: e.shopId || "",
sign_type: e.signType || "SHA1",
card_id: e.cardId || "",
card_type: e.cardType || "",
card_sign: e.cardSign,
time_stamp: e.timestamp + "",
nonce_str: e.nonceStr
},
(e._complete = function(e) {
e.cardList = e.choose_card_info,
delete e.choose_card_info
},
e))
},
openCard: function(e) {
for (var n = e.cardList,
t = [], o = 0, r = n.length; o < r; ++o) {
var a = n[o],
c = {
card_id: a.cardId,
code: a.code
};
t.push(c)
}
i(h.openCard, {
card_list: t
},
e)
},
consumeAndShareCard: function(e) {
i(h.consumeAndShareCard, {
consumedCardId: e.cardId,
consumedCode: e.code
},
e)
},
chooseWXPay: function(e) {
i(h.chooseWXPay, r(e), e)
},
openEnterpriseRedPacket: function(e) {
i(h.openEnterpriseRedPacket, r(e), e)
},
startSearchBeacons: function(e) {
i(h.startSearchBeacons, {
ticket: e.ticket
},
e)
},
stopSearchBeacons: function(e) {
i(h.stopSearchBeacons, {},
e)
},
onSearchBeacons: function(e) {
t(h.onSearchBeacons, e)
},
openEnterpriseChat: function(e) {
i("openEnterpriseChat", {
useridlist: e.userIds,
chatname: e.groupName
},
e)
},
launchMiniProgram: function(e) {
i("launchMiniProgram", {
targetAppId: e.targetAppId,
path: g(e.path),
envVersion: e.envVersion
},
e)
},
miniProgram: {
navigateBack: function(e) {
e = e || {},
f(function() {
i("invokeMiniProgramAPI", {
name: "navigateBack",
arg: {
delta: e.delta || 1
}
},
e)
})
},
navigateTo: function(e) {
f(function() {
i("invokeMiniProgramAPI", {
name: "navigateTo",
arg: {
url: e.url
}
},
e)
})
},
redirectTo: function(e) {
f(function() {
i("invokeMiniProgramAPI", {
name: "redirectTo",
arg: {
url: e.url
}
},
e)
})
},
switchTab: function(e) {
f(function() {
i("invokeMiniProgramAPI", {
name: "switchTab",
arg: {
url: e.url
}
},
e)
})
},
reLaunch: function(e) {
f(function() {
i("invokeMiniProgramAPI", {
name: "reLaunch",
arg: {
url: e.url
}
},
e)
})
},
postMessage: function(e) {
f(function() {
i("invokeMiniProgramAPI", {
name: "postMessage",
arg: e.data || {}
},
e)
})
},
getEnv: function(n) {
f(function() {
n({
miniprogram: "miniprogram" === e.__wxjs_environment
})
})
}
}
},
b = 1,
R = {};
return S.addEventListener("error",
function(e) {
if (!M) {
var n = e.target,
i = n.tagName,
t = n.src;
if (("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i) && -1 != t.indexOf("wxlocalresource://")) {
e.preventDefault(),
e.stopPropagation();
var o = n["wx-id"];
if (o || (o = b++, n["wx-id"] = o), R[o]) return;
R[o] = !0,
wx.ready(function() {
wx.getLocalImgData({
localId: t,
success: function(e) {
n.src = e.localData
}
})
})
}
}
},
!0),
S.addEventListener("load",
function(e) {
if (!M) {
var n = e.target,
i = n.tagName;
n.src;
if ("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i) {
var t = n["wx-id"];
t && (R[t] = !1)
}
}
},
!0),
n && (e.wx = e.jWeixin = N),
N
}
});
编写html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<button class="btn btn_primary" id="onMenuShareAppMessage">onMenuShareAppMessage</button>
</head>
<body>
</body>
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="jweixin-1.0.0.js"></script>
<script type="text/javascript">
$(function() {
//对url进行编码
var localUrl = encodeURIComponent(location.href.split('#')[0]);
//url传到后台格式
// var Url =localUrl;
alert(localUrl);
//这几个参数都是后台从微信公众平台获取到的
var nonceStr, signature, timestamp, appId, shareUrl;
$.ajax({
//后台获取参数接口
// url: "http://ym1.jiang178.com:8089/send/app/message/weiSign?url" + localUrl,
url: "http://ym1.jiang178.com/weiSign?url=" + localUrl,
// beforeSend: function(xhr) {
// xhr.setRequestHeader("Token", getCookie("token"));
// },
type: 'get',
success: function(data) {
//得到参数
appId = "wx5e0c69abe17926d8";
timestamp = data.timestamp;
signature = data.signature;
nonceStr = data.nonceStr;
shareUrl = "http://ym1.jiang178.com/share.html";
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,企业号的唯一标识,此处填写企业号corpid
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature,// 必填,签名,见附录1
jsApiList: [
'updateTimelineShareData',
'updateAppMessageShareData'
]
});
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateTimelineShareData({
title: "eeeeeee",// 分享标题
desc: "eeeeeee", // 分享描述
link: shareUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: "http://jlpa.jiang178.com/home/ubuntu/JLProd/upload/image/20191029/1572311071647000597.png", // 分享图标
success: function () {
// alert("分享成功");
}
})
});
//自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: "eeeeeee", // 分享标题
desc: "eeeeeee", // 分享描述
link: shareUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: "http://jlpa.jiang178.com/home/ubuntu/JLProd/upload/image/20191029/1572311071647000597.png", // 分享图标
success: function () {
// alert("分享成功");
}
})
});
}
});
})
</script>
</html>
4.服务器及后台配置
TIP:**返回签名接口,html文件,js安全约束文件在同一个包下
需要对返回签名接口配置转发,转发路径为服务器路径
4.1代码配置转发
package com.weifeng.filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("file:/home/zhouziwei/share/");
}
}
请求get ,post 方法的工具类
package com.weifeng.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class HttpClientUtil {
/**
* 描述:发送get请求
* @param url 请求URL
* @param param 请求参数 key:value url携带参数 或者无参可不填
* @author zhouziwei
* @date 2021/3/10 17:56
*/
public static String doGet(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url) {
return doGet(url, null);
}
/**
* 描述:发送post请求
*
* @author zhouziwei
* @date 2021/3/19 15:01
*/
public static String send(String url, JSONObject jsonObject, String encoding) throws ParseException, IOException{
String body = "";
//创建httpclient对象
CloseableHttpClient client = HttpClients.createDefault();
//创建post方式请求对象
HttpPost httpPost = new HttpPost(url);
//装填参数
StringEntity s = new StringEntity(jsonObject.toString(), "utf-8");
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
"application/json"));
//设置参数到请求对象中
httpPost.setEntity(s);
System.out.println("请求地址:"+url);
// System.out.println("请求参数:"+nvps.toString());
//设置header信息
//指定报文头【Content-type】、【User-Agent】
// httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.setHeader("Content-type", "application/json");
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
httpPost.setHeader("Authorization","Bearer eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NDc1NzE0NTgsInN1YiI6IntcInBob25lXCI6XCIxMzU5MTQ2MjA4OVwiLFwiY29tcGFueUlkXCI6MCxcIm1vZGVsSWRcIjpudWxsLFwiaXNBZG1pblwiOjF9IiwiaWF0IjoxNjE2MDM1NDU4OTU4fQ.Z22zyXgbMraI3EICf0b8j39WAZzMze9srN_CW5PKBhPJp-qEmhaZlrLB98vOAjDnfd8NWuw_bTeio_hHxVz4xg");
//执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
body = EntityUtils.toString(entity, encoding);
}
EntityUtils.consume(entity);
//释放链接
response.close();
return body;
}
/**
* 描述:发送post请求
* @param url 请求URL
* @param param 请求参数 key:value url携带参数 或者无参可不填
* @author zhouziwei
* @date 2021/3/10 17:56
*/
public static String doPost(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
/**
* 发送post 请求
* @param url 请求地址
* @param json 请求参数
* @return
*/
public static String doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
}
OK!
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
/**
* 发送post 请求
* @param url 请求地址
* @param json 请求参数
* @return
*/
public static String doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
}
# OK!