1. 程式人生 > >微信分享內容給朋友、朋友圈、QQ、QQ空間等

微信分享內容給朋友、朋友圈、QQ、QQ空間等

示例網頁

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<meta name="author" content="ershuai" />
<meta name="Copyright" content="ershuai" />


<title>二帥</title>


<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="../scripts/common/wx_share/wechat_common_share.js"></script>
</head>
<body>
	init share
</body>
<script type="text/javascript">
	$(document).ready(function() {
		var initUrl = window.location.href;
		var shareLogo = "http://img3.imgtn.bdimg.com/it/u=224917259,3388622236&fm=21&gp=0.jpg";
		var lineLink = "https://www.baidu.com";
		var shareContent = "分享的內容描述";
		var shareTitle = "分享的標題描述";
		initShare(initUrl, lineLink, shareTitle, shareContent, shareLogo);
	});
</script>
</html>


wechat_common.share.js

var init_share_url = "http://[host]/wechat/initWechatConfig.xhtml";


/**
 * 初始化分享
 * @param initUrl			當前初始化網頁地址
 * @param lineLink			點選後跳轉地址
 * @param shareTitle		分享標題
 * @param shareContent		分享內容
 * @param shareLogo			分享logo
 */
function initShare(initUrl, lineLink, shareTitle, shareContent, shareLogo) {
	$.ajax({
		type : "post",
		url : init_share_url,
		data : {
			"initUrl" : initUrl,
			"initType" : "jsapi"
		},
		dataType : "json",
		error : function(request) {
			alert('初始化分享失敗,請稍後重試');
		},
		success : function(ajaxRes) {
			var state = ajaxRes.state;
			if (state == 1) {
				var data = ajaxRes.data;
				//初始化微信配置
				wxShareConfig(data.appId, data.timestamp, data.nonceStr, data.signature);
				//分享準備
				wxShareReady(lineLink, shareTitle, shareContent, shareLogo);
			} else {
				alert(ajaxRes.msg);
			}
		}
	});
};


/**
 * 初始化微信分享配置
 * @param appId
 * @param timestamp
 * @param nonceStr
 * @param signature
 */
function wxShareConfig(appId, timestamp, nonceStr, signature) {
	wx.config({
		debug: false,
		appId: appId,
		timestamp: timestamp,
		nonceStr: nonceStr,
		signature: signature,
		jsApiList: [
			'checkJsApi',
			'onMenuShareTimeline',
			'onMenuShareAppMessage',
			'onMenuShareQQ',
			'onMenuShareQZone'
		]
	});
	
	wx.error(function (res) {
		alert(res.errMsg);
	});
}


/**
 * 分享準備
 * @param lineLink
 * @param shareTitle
 * @param shareContent
 * @param shareLogo
 */
function wxShareReady(lineLink, shareTitle, shareContent, shareLogo) {
	wx.ready(function () {
		//獲取“分享到朋友圈”
		wx.onMenuShareTimeline({
		    title: shareTitle, // 分享標題
		    link: lineLink, // 分享連結
		    imgUrl: shareLogo, // 分享圖示
		    success: function () { 
		        // 使用者確認分享後執行的回撥函式
		    },
		    cancel: function () { 
		        // 使用者取消分享後執行的回撥函式
		    }
		});
		
		//獲取“分享給朋友”
		wx.onMenuShareAppMessage({
		    title: shareTitle, // 分享標題
		    desc: shareContent, // 分享描述
		    link: lineLink, // 分享連結
		    imgUrl: shareLogo, // 分享圖示
		    type: 'link', // 分享型別,music、video或link,不填預設為link
		    dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
		    success: function () { 
		        // 使用者確認分享後執行的回撥函式
		    	//alert('已分享');
		    	//window.location.href = "https://www.baidu.com";
		    },
		    cancel: function () { 
		        // 使用者取消分享後執行的回撥函式
		    	//alert('已取消');
		    }
		});
		
		//獲取“分享到QQ”
		wx.onMenuShareQQ({
		    title: shareTitle, // 分享標題
		    desc: shareContent, // 分享描述
		    link: lineLink, // 分享連結
		    imgUrl: shareLogo, // 分享圖示
		    success: function () { 
		       // 使用者確認分享後執行的回撥函式
		    },
		    cancel: function () { 
		       // 使用者取消分享後執行的回撥函式
		    }
		});
		
		//獲取“分享到QQ空間”
		wx.onMenuShareQZone({
		    title: shareTitle, // 分享標題
		    desc: shareContent, // 分享描述
		    link: lineLink, // 分享連結
		    imgUrl: shareLogo, // 分享圖示
		    success: function () { 
		       // 使用者確認分享後執行的回撥函式
		    },
		    cancel: function () { 
		       // 使用者取消分享後執行的回撥函式
		    }
		});
		
		//獲取“分享到騰訊微博”
		wx.onMenuShareWeibo({
		    title: shareTitle, // 分享標題
		    desc: shareContent, // 分享描述
		    link: lineLink, // 分享連結
		    imgUrl: shareLogo, // 分享圖示
		    success: function () { 
		       // 使用者確認分享後執行的回撥函式
		    },
		    cancel: function () { 
		        // 使用者取消分享後執行的回撥函式
		    }
		});
	});
}


到這裡,前端就完事了

現在實現,init_share_url方法

var init_share_url = "http://[host]/wechat/initWechatConfig.xhtml";

initWechatConfig方法內容:

(因為我這個有多個服務號要維護,是根據rawId來判斷的;一般情況是不用rawId引數的)

@RequestMapping("/initWechatConfig.xhtml")
	public void initWechatConfig(HttpServletRequest request, HttpServletResponse response) throws Exception {
		try {
			String initUrl = getParams("initUrl");//當前網頁地址
			String initType = getParams("initType");
			if (CommonUtil.isNull(initUrl) || CommonUtil.isNull(initType)) {//判斷null
				throw new BizException(ErrorMsg.PARAMS_NULL);
			}
			String rawId = getParams("rawId");
			if (CommonUtil.isNull(rawId)) {
				rawId = Constants.RawId_broker;
			}
			HashMap<String, Object> respMap = new HashMap<String, Object>();
			if ("jsapi".equals(initType)) {//初始化分享
				String noncestr = RandomUtil.nextInt(initType.toUpperCase(), 100, 999);//隨機數,用uuid什麼的也可以
				String timestamp = DateUtil.getTimestampWx();//時間戳 Long.toString(System.currentTimeMillis() / 1000)
				String signature = null;
				//獲取
				Ticket ticket = this.wechatService.getJsapiTicket(rawId);
				signature = SHA1Util.signForJsapiTicket(ticket.getTicket(), noncestr, timestamp, initUrl);
				respMap.put("appId", Constants.getAppId(rawId));
				respMap.put("timestamp", timestamp);
				respMap.put("nonceStr", noncestr);
				respMap.put("signature", signature);
			} else if ("pay".equals(initType)) {//初始化支付
				
			}
			writeSuccMsg(response, respMap);
		} catch (Exception e) {
			log.error("初始化微信配置 異常:", e);
			writeErrorMsg(response, e.getMessage());
		}
	}


RequestAddr的引數配置

// 獲取access_token的介面地址(GET) API要求每天限制2000 - 全域性access_token
public static final String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";

// 獲取ticket_url的介面地址(GET) API
public static final String ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
// 獲取ticket_url的引數
public static final String ticket_url_params = "jsapi_ticket=JSAPI_TICKET&noncestr=NONCESTR&timestamp=TIMESTAMP&url=INIT_URL";

getJsapiTicket方法

public Ticket getJsapiTicket(String rawId) throws Exception {
		//請求全域性access_token
		AccessToken accessToken = getAccessToken(rawId);
		//獲取jsapi_ticket
		Ticket ticket = WeChatUtils.getJsapiTicket(accessToken.getAccess_token());
		return ticket;
	}

/**
	 * 獲取全域性access_token 公共方法
	 * @author ershuai 
	 * @version V1.0 
	 * @param rawId
	 * @return
	 * @throws Exception
	 */
	public AccessToken getAccessToken(String rawId) throws Exception {
		//請求全域性access_token
		AccessToken accessToken = WeChatUtils.getAccessToken(rawId);
		return accessToken;
	}


WeChatUtils類

/**
	 * 憑證access_token的獲取方法	-	全域性access_token
	 * @author ershuai
	 * @version V1.0 
	 * @return
	 * @throws Exception
	 */
	public static AccessToken getAccessToken(String rawId) throws Exception {
		String appId = Constants.getAppId(rawId);
		String appSecret = Constants.getAppSecret(rawId);
		//url
		String access_token_url = RequestAddr.access_token_url;
		//匹配引數
		access_token_url = access_token_url.replace("APPID", appId);
		access_token_url = access_token_url.replace("SECRET", appSecret);
		//匹配引數
		//請求
		String respStr = WebUtils.doGet(access_token_url, null);
		AccessToken accessToken = null;
		if (null != respStr) {
			accessToken = JSON.parseObject(respStr, AccessToken.class);
		}
		return accessToken;
	}

	
	/**
	 * 憑證JsapiTicket的獲取方法
	 * @author ershuai 
	 * @version V1.0 
	 * @param accessToken
	 * @return
	 * @throws Exception
	 */
	public static Ticket getJsapiTicket(String accessToken) throws Exception {
		//url
		String jsapi_ticket_url = RequestAddr.ticket_url.replace("ACCESS_TOKEN", accessToken);
		//匹配引數
		jsapi_ticket_url = jsapi_ticket_url.replace("ACCESS_TOKEN", accessToken);
		//請求
		String respStr = WebUtils.doGet(jsapi_ticket_url, null);
		Ticket ticket = null;
		if (null != respStr) {
			ticket = JSON.parseObject(respStr, Ticket.class);
		}
		return ticket;
	}



SHA1Util類

/**
	 * sign簽名,對於 jsapi_ticket
	 * @author ershuai
	 * @version V1.0
	 * @param jsapiTicket
	 * @param noncestr
	 * @param timestamp
	 * @param initUrl
	 * @return
	 */
	public static String signForJsapiTicket(String jsapiTicket, String noncestr, String timestamp, String initUrl) {
		String signature = null;
		// 注意這裡引數名必須全部小寫,且必須有序
		String signatureStr = RequestAddr.ticket_url_params;
		signatureStr = signatureStr.replace("JSAPI_TICKET", jsapiTicket);
		signatureStr = signatureStr.replace("NONCESTR", noncestr);
		signatureStr = signatureStr.replace("TIMESTAMP", timestamp);
		signatureStr = signatureStr.replace("INIT_URL", initUrl);
		try {
			MessageDigest crypt = MessageDigest.getInstance("SHA-1");
			crypt.reset();
			crypt.update(signatureStr.getBytes("UTF-8"));
			signature = byteToHex(crypt.digest());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return signature;
	}

	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;
	}



PS:做完以上流程,應該就可以完成分享功能了;出現最多的錯誤應該就是簽名不正確,這個問題檢查幾個微信引數就好了;

config:invalid url domain 錯誤是需要去  公眾號設定 - 功能設定 - JS介面安全域名;配置域名

相關推薦

分享內容朋友朋友QQQQ空間

示例網頁 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="renderer" content="webkit"> <meta

自定義分享內容

bsp log 域名 span times con sign grant 頁面 1、公眾號設置 -> 功能設置 :填寫“JS接口安全域名” 2、引入js文件:http://res.wx.qq.com/open/js/jweixin-1.2.0.js 3、獲取Acces

.Net網頁開發之使用JS-SDK自定義分享內容

第一步、微信JS-SDK的使用步驟,配置資訊的生成獲取講解:   關於JS-SDK的使用步驟和timestamp(時間戳),nonceStr(隨機串),signature(簽名),access_token(介面呼叫憑據)生成獲取的詳細說明在這裡:https://www.cnblogs.com/Can-day

分享朋友傳送朋友開發注意事項

1、invalid url domain 當前頁面所在域名與使用的appid沒有繫結,請確認正確填寫繫結的域名,如果使用了埠號,則配置的繫結域名也要加上埠號(一個appid可以繫結三個有效域名,見 目錄1.1.1)。 2、invalid signature簽名錯誤。 建議按如下順序檢查:

關於分享朋友分享朋友隱藏“傳播類”和“保護類”按鈕

1、引入微信官方的js檔案,將該js檔案放到最前面引入:<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> 2、初始化微信所需引數: 2.1 注意:wx.con

分享朋友分享程式碼自定義標題說明圖示和分享連結

最近在做手機網站在分享到微信時,通過微信內建瀏覽器訪問頁面分享後,希望可以自定義小圖示(imgUrl)和分享連結(lineLink),下面下微信內建瀏覽器分享功能的JS程式碼,希望對大家有所幫助。 JS程式碼如下:        var imgUrl = "http://www.gdibn.com/m/im

簡單粗暴教你在VUE中引入微SDK 呼叫分享朋友分享QQ分享......

寫在前面: 剛做了一個微信端的網頁,用到了微信分享,在網上看了好多的資料,發現好多文件都寫得雲裡霧裡,讓人看的頭疼。通過對很多大佬文章的綜合整理,才完成了微信分享的部分。所以我想著自己寫一篇文章,能讓看到我這篇文章的親們能夠清楚的明白在vue上怎麼使用微信分享SDK,能夠按照

iOS開發之第三方分享分享朋友分享,史上最新最全第三方分享方式實現朋友方式實現

微信分享前提:  1.需要成功在微信開發者平臺註冊了賬號, 並取的對應的 appkey appSecret。         2. 針對iOS9 添加了微信的白名單,以及設定了 scheme url 。 這都可以參照上面的連結,進行設定好。   3. 分享不跳轉的時

分享朋友分享朋友JS程式碼

</body> <script>  $(document).ready(function(){   /*    * 注意:    * 1. 所有的JS介面只能在公眾號繫結的域名下呼叫,公眾號開發者需要先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”

分享朋友”介面— wx.onMenuShareTimeline() 和 onMenuShareAppMessage — 分享朋友介面

微信“分享到朋友圈”介面—— wx.onMenuShareTimeline()  注意事項: 1. 圖片大小要大於300pix才能顯示; 2. 這個方法必須先config成功,然後再wx.ready裡才能呼叫。直接放到$(function(){})裡執行,實踐證明是不行的。

分享朋友失敗,分享朋友正常

微信分享朋友圈,提示             獲取資源失敗,僅支援分享照片至朋友圈 原因:繞過稽核分享到朋友圈一定要加一張圖片才可以的  ShareSDK.xml裡面   BypassAppr

分享自定義樣式&分享朋友自定義圖文資訊

下圖為效果圖:上圖為沒有設定得樣式,下圖是設定樣式分享後的效果,差距甚遠。 做的過程也遇到了一些問題,我會在博文最下方標明. 下面是我的程式碼: <!DOCTYPE html> <html lang="en"> <head>

iOS9中實現分享到好友朋友

微信SDKdemo執行錯誤問題 微信SDK接入設定 實現分享到好友、朋友圈 微信SDKdemo執行錯誤問題 下載了官方的demo,激動地運行了一下,十幾個錯誤,內心其實是崩潰的。 根據錯誤提示,去修改a

Android APP中跳轉至分享圖文好友或者朋友(加跳轉QQ好友或QQ群)

/**      * 分享圖片給好友      *      * @param file      */ private void shareToFriend(File file) {     Intent intent = new Intent();     ComponentName comp = new

分享朋友朋友JS程式碼

<script> var imgUrl = "圖片地址"; var lineLink = "網址"; var descContent = '描述文字在這裡.....'; var shareTitle

公眾平臺網頁開發實戰--1.分享一個網頁到朋友

微信開發 html5 jssdk 實戰 網頁開發 對微信的JSSDK進行封裝一下,創建一份類似的文件結構,增加index.html與shareApi.js文件,結構如圖3.3所示。 圖3.3 3.2節文件結構另外,提醒讀者一下,wxJSSDK.js文件的JSSDK環境配置中,需要

h5 分享朋友朋友

lose reat 加載 -1 微信 host ces menus html 生成JS-SDK權限驗證簽名 實現發送給朋友和分享到朋友圈時內容參數自定義 一、微信JS-SDK 1. 獲得Access Token access token的獲得方法在前面有介紹,詳情見

php實現分享朋友

public private abcd ushare name preview set PE char class JSSDK { private $appId; private $appSecret; public function __construct($a

iOS 分享朋友

最近要加微信朋友圈分享的功能,上官網下檔案,照著文件搭環境,但是總有錯誤,於是百度部落格來看,發現和官方文件一樣,解決不了自己的問題,現在問題解決了,分享出來希望對大家有幫助。 1.首先要向微信註冊你的應用程式IDhttps://open.weixin.qq.com/cgi-bin/frame?

Vux+Cordova打包的安卓App實現分享朋友朋友

知識儲備 Cordova Plugin ShareSDK 外掛 什麼是Cordova Plugin ShareSDK Cordova Plugin ShareSDK封裝了ShareSDK的android和ios平臺的分享功能。在hybird app開發中可以方便的完成分享功能。如:ion