微信分享很多人都接触过,我只是把我自己的方法写了一下。不好之处,敬请原谅!
先来一张流程图,很实用,也是网上找的,感谢这位博主。
编辑
公众号配置那些就不写了,直接上代码吧!
1)、官方上面有相应的签名代码,下载下来就行
进入官方文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 拉到最下面,就能下载了
编辑
解压之后,里面有各种语言的签名代码,我们只需要 java 的就可以了,里面只有一个文件,我们先看看微信的签名代码
编辑
先看看微信的签名代码
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;
class Sign {
public static void main(String[] args) {
String jsapi_ticket = "jsapi_ticket";
// 注意 URL 一定要动态获取,不能 hardcode
String url = "http://example.com";
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);
}
}
2)、 获取access_token、ticket,签名
注意:JSONObject 引入的是 import net.sf.json.JSONObject
/**
* 微信分享
*/
@RestController
@RequestMapping("/app/insure/wx/share")
public class AppWXShareController extends AppBaseController {
private static Logger logger = Logger.getLogger(AppWXShareController.class);
@Value("${appid}")
private String APPID;
@Value("${secret}")
private String APPSECRET;
/**
* 微信分享
*/
@RequestMapping("/wxShare")
public Map<String, Object> wxShare(@RequestParam("url") String url) {
Map<String, Object> json = null;
try {
// 创建通过Api获取Token的链接与参数
String requestTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
requestTokenUrl = requestTokenUrl.replace("APPID", APPID);
requestTokenUrl = requestTokenUrl.replace("APPSECRET", APPSECRET);
RestTemplate restTemplate = new RestTemplate();
String tokenUrl = restTemplate.getForObject(requestTokenUrl, String.class);
if (StringUtils.isNotEmpty(tokenUrl)) {
JSONObject jsonObjectToken = JSONObject.fromObject(tokenUrl);
// 获取Token值
String access_token = jsonObjectToken.getString("access_token");
// 获取Token有效期值
// expires_in = jsonObjectToken.getLong("expires_in");
String requestTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
requestTicketUrl = requestTicketUrl.replace("ACCESS_TOKEN", access_token);
// 获取凭证
String ticketUrl = restTemplate.getForObject(requestTicketUrl, String.class);
if (StringUtils.isNotEmpty(ticketUrl)) {
JSONObject jsonObjectTicket = JSONObject.fromObject(ticketUrl);
String ticket = jsonObjectTicket.getString("ticket");
Map<String, String> stringMap = WxShareSign.sign(ticket, url);
json = this.getJsonMap(true, "success", stringMap);
}
}
} catch (Exception e) {
logger.error("AppInsureMainController.getList", e);
json = this.getJsonMap(false, "error", null);
}
return json;
}
}
3)、前端config函数配置
下面的代码放在网页js代码的最前面!
下面只展示了微信朋友圈的,和微信好友的方法,剩下的,QQ,QQ空间之类的,可以到 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 这里都写完整的了
这里建议ur参数不要写成固定地址,用提供的获取当前路径的方法获取,可以保证该js的重用:
var url = location.href.split('#')[0];
$(function(){
var title = $("#title").val();
var desc = $("#desc").val();
var name = $("#program_name").val();
var imgUrl = $("#imgurl").val();
var path = $("#path").val();
var url = location.href.split('#')[0];
var signature,timestamp,noncestr,appid;
/*微信分享*/
$.ajax({
url:path+"/app/insure/wx/share/wxShare",
type:'GET',
data:{
url : url
},
success:function (data) {
signature = data.weixinShare.wx_signature;
timestamp = data.weixinShare.wx_timestamp;
noncestr = data.weixinShare.wx_noncestr;
appid = data.appid;
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appid, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: noncestr, // 必填,生成签名的随机串
signature: signature,// 必填,签名
jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表
});
wx.ready(function(){
//分享给朋友
wx.onMenuShareAppMessage({
title: title, // 分享标题
desc: desc, // 分享描述
link: path, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl:imgUrl, // 分享图标s
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
// alert("OK");
},
cancel: function () {
// 用户取消分享后执行的回调函数
// alert("fail");
}
});
//分享给朋友圈
wx.onMenuShareTimeline({
title: title, // 分享标题
link: path, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
});
});
},
error:function(error){
console.log(error);
}
});
})
以上,就大功告成了,还有一点值得注意一下,分享图标需要小于 300K 才行
要是还有不懂的,欢迎留言,大神请路过,谢谢
标签:java,String,url,微信,timestamp,后台,ticket,分享 From: https://www.cnblogs.com/fenghd/p/17422629.html