微信網頁開發 jssdk前後端代碼,PHP實現完整代碼,自定義分享

如果你頁面啓用了https,務必引入 https😕/res.wx.qq.com/open/js/jweixin-1.0.0.js ,否則將無法在iOS9.0以上系統中成功使用JSSDK

微信網頁JS-SDK的功能實現,後端php,完整源碼。分享內容自定義。

jsapi_ticket ,access_token,wx_card_ticket 這些參數有實效限制,所以記錄在了數據庫,超時重新獲取。

效果圖:

訪問地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd9c832f1bafb383d&redirect_uri=https%3A%2F%2Fjayjing.wang%2Fwx_h5_jssdk_fenxiang%2FgetAccess_token.php%3Fac_id%3D202004sad14&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect

他會自動跳轉到填的 redirect_uri 的地址,redirect_uri的值需要先url編碼。

php代碼

getAccess_token.php

<?php
    header("Content-Type:text/html;charset=utf8"); 
	header("Access-Control-Allow-Origin: *"); //解決跨域
	header('Access-Control-Allow-Methods:GET');// 響應類型  
	header('Access-Control-Allow-Headers:*'); // 響應頭設置 
	$appid = "wxd9c8111111";
	$secret = "dcec3a1111111111111111111111";
	$code = $_GET['code'];
	$ac_id = $_GET['ac_id'];
	// 獲取授權的
	$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";
	//網頁授權得到結果:$s = "{\"access_token\":\"32_P2gAMCy1B5Nxj6f214o3QXPeAI4c8wqeg9pIAh5Q5Xu_7gigCShnK_hUqPbSgSDKrpfdP5M3ZbieXwvlbJnHJQ\",\"expires_in\":7200,\"refresh_token\":\"32_HyDtpGDuwh-JDxK4yCkU14_oe4Z1VofusV6xjnJ3pnDYf4Bf2iEjxhS__63_qOWVpmecmb4pxWIyz0hCv3muJQ\",\"openid\":\"o_EZdwFq8g39d-jQPkOh6lXGkqG4\",\"scope\":\"snsapi_userinfo\",\"unionid\":\"odpLct4586g19xTw8q5tvdAXPUHU\"}"
	// 獲取普通的
        // $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
        $s = file_get_contents($url);
		$s = json_decode($s, true);
        // echo $s['access_token'];
		// echo urldecode(json_encode($s));
		$access_token =$s['access_token'];
		$openid =$s['openid'];
		$userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";
		$userinfo_data = file_get_contents($userinfo_url);
		// echo urldecode(json_encode($userinfo_data));
		
		// 得到的用戶基礎信息
		//$info =:"{\"openid\":\"o_EZdwFq8g39d-jQPkOh6lXGkqG4\",\"nickname\":\"a_\u9756\",\"sex\":1,\"language\":\"zh_CN\",\"city\":\"\",\"province\":\"\",\"country\":\"\u4e2d\u56fd\",\"headimgurl\":\"http:\\\/\\\/thirdwx.qlogo.cn\\\/mmopen\\\/vi_32\\\/Q0j4TwGTfTLpAib9yVTp6B6MCbQJBy7QSYWuC3RpxJ6wc83xyEgdSh5fpyHWc5NBRH8F2uaNYbDagFIqUKTfyxw\\\/132\",\"privilege\":[],\"unionid\":\"odpLct4586g19xTw8q5tvdAXPUHU\"}"
		
		$info =json_decode($userinfo_data, true);
		$openid = $info["openid"];
		$nickname = $info["nickname"];
		$headimgurl = $info["headimgurl"];
?>

	<!DOCTYPE html>
	<html lang="en">
		<head>
			<title>績溪公安公衆號</title>
			<meta charset="UTF-8">
			<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
	
			<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
			<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
			<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
			<script type="text/javascript" src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
		<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
			<script>
				new VConsole();
			</script></head>
			<body>
				
							<input type="hidden" id="ac_id" name="text1" value="<?=$ac_id?>">
							<input type="hidden" id="openid" name="text1" value="<?=$openid?>">
							<input type="hidden" id="appid" name="text1" value="<?=$appid?>">
							<input type="hidden" id="nickname" name="text1" value="<?=$nickname?>">
							<input type="hidden" id="headimgurl" name="text1" value="<?=$headimgurl?>">
							<script>
								var appid =$("#appid").val();
								var openid =$("#openid").val();
								var nickname =$("#nickname").val();
								var headimgurl =$("#headimgurl").val();
								var ac_id =$("#ac_id").val();
								if(appid&&headimgurl&&nickname){
									setTimeout(function(){
									var p_url = "?appid="+appid+"&headimgurl="+encodeURIComponent(headimgurl)+"&nickname="+nickname+"&openid="+openid+"&ac_id="+ac_id;
									// window.close();
									window.location="https://jayjing.wang/wx_h5_jssdk_fenxiang/shareArticle.php"+p_url;
									},500)
								}else{
									console.log('appid',appid)
									console.log('headimgurl',headimgurl)
									console.log('nickname',nickname)
									console.log('openid',openid)
									console.log('沒跳轉頁面')
								}
							</script>
			</body>
	</html>

shareArticle.php

<?php
    header("Content-Type:text/html;charset=utf8"); 
	header("Access-Control-Allow-Origin: *"); //解決跨域
	header('Access-Control-Allow-Methods:GET');// 響應類型  
	header('Access-Control-Allow-Headers:*'); // 響應頭設置 
	$appid = "wxd9c832f1111";
	$secret = "dcec3a4811111111111";
	$openid = $_GET['openid'];
	$nickname = $_GET['nickname'];
	$headimgurl = $_GET['headimgurl'];
	$ac_id = $_GET['ac_id'];
	
	$servername = "localhost";
	$username = "root";
	$password = "root";
	$dbname = "demo";
	 
	// 創建連接
	$conn = new mysqli($servername, $username, $password, $dbname);
	// Check connection
	if ($conn->connect_error) {
	    die("連接失敗: " . $conn->connect_error);
	} 
	 
	$sql = "SELECT access_token_, _time, jsapi_ticket FROM js_sdk";
	$result = $conn->query($sql);
				// 進行sha1簽名
				$timestamp = time();
				$nonceStr = createNonceStr();
	 
	if ($result->num_rows > 0) {
	    // 輸出數據
	    while($row = $result->fetch_assoc()) {
			if(number_format(time()-$row["_time"]>7200)){
				$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
				$s = file_get_contents($url);
				$s = json_decode($s, true);
				$access_token =$s['access_token'];
				
				$url_b = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
				$data = file_get_contents($url_b);
				$data = json_decode($data, true);
				$jsapi_ticket = $data['ticket'];
				
				$_time = time();
				
				//echo $_time. "<br>".$jsapi_ticket. "<br>".$access_token. "<br>".$wx_card_ticket. "<br>";
				$m_sql ="UPDATE js_sdk SET _time = $_time, jsapi_ticket = '$jsapi_ticket', access_token_ = '$access_token', wx_card_ticket = '$wx_card_ticket'";
				mysqli_query($conn,$m_sql);
	
				mysqli_close($conn);
				
				// 注意 URL 一定要動態獲取,不能 hardcode.
				$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
				$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
				// $url = "https://jayjing.wang/wx_h5_jssdk_card/index.html";
				
				$str = "jsapi_ticket={$jsapi_ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
				$signature = sha1($str);
				
				$signPackage = array(
				    "appId" =>  $appid,
				    "nonceStr" => $nonceStr,
				    "timestamp" => $timestamp,
				    "signature" => $signature,
					"access_token"=>$access_token,
					"url"=>$url,
					"jsapi_ticket"=>$jsapi_ticket,
					"string1"=>$str,
					"wx_card_ticket"=>$wx_card_ticket,
					"_type"=>"db"
				);
				// echo urldecode(json_encode($signPackage));
			}else{
				
				$access_token =$row['access_token_'];
				$jsapi_ticket =$row['jsapi_ticket'];
				$wx_card_ticket =$row['wx_card_ticket'];
				
				// 注意 URL 一定要動態獲取,不能 hardcode.
				$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
				$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
				// $url = "https://jayjing.wang/wx_h5_jssdk_card/index.html";
				
				$str = "jsapi_ticket={$jsapi_ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
				$signature = sha1($str);
						
				$signPackage = array(
				    "appId" =>  $appid,
				    "nonceStr" => $nonceStr,
				    "timestamp" => $timestamp,
				    "signature" => $signature,
					"access_token"=>$access_token,
					"url"=>$url,
					"string1"=>$str,
					"jsapi_ticket"=>$jsapi_ticket,
					"wx_card_ticket"=>$wx_card_ticket,
					"_type"=>"low"
				);
				
				// echo urldecode(json_encode($signPackage));
			}
	    }
	} else {
	    echo "0 結果";
	}
	$conn->close();
	   
	//隨機字符串
	function createNonceStr() {
		$length = 16;
		$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		$str = "";
		for ($i = 0; $i < $length; $i++) {
			$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
		}
		return $str;
	};
	//print();
    // echo $ticket;
?>
	
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>績溪公安公衆號</title>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />

		<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
		<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
		<!-- <script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script> -->
		<!-- <script src="http://res.wx.qq.com/open/js/jweixin-1.3.0.js"></script> -->
		<script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
		<script type="text/javascript" src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
		<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
		<script>
			new VConsole();
			</script>
	</head>
	<body>

		<input type="hidden" id="appId" name="text1" value="<?=$appid?>">
		<input type="hidden" id="ac_id" name="text1" value="<?=$ac_id?>">
		<input type="hidden" id="timestamp" name="text1" value="<?=$timestamp?>">
		<input type="hidden" id="nonceStr" name="text1" value="<?=$nonceStr?>">
		<input type="hidden" id="signature" name="text1" value="<?=$signature?>">
		<input type="hidden" id="openid" name="text1" value="<?=$openid?>">
		<input type="hidden" id="nickname" name="text1" value="<?=$nickname?>">
		<input type="hidden" id="headimgurl" name="text1" value="<?=$headimgurl?>">
		
		<div class="article_html"></div>
		<script>
			var ac_id = $("#ac_id").val();
			let en_html ="./article_html"+ac_id+".html";
			console.log("en_html",en_html)
			$(".article_html").load(en_html);
			
			var openid = $("#openid").val();
			var nickname = $("#nickname").val();
			var headimgurl = $("#headimgurl").val();

			var appId = $('#appId').val();
			var timestamp = $('#timestamp').val();
			var nonceStr = $('#nonceStr').val();
			var signature = $('#signature').val();

			console.log('openid:', openid)
			console.log('signature', signature)
			if(!openid){
				window.location="https://jayjing.wang/wx_h5_jssdk_fenxiang/shareArticle.php?appid=wxd9c832f1bafb383d&headimgurl=http%3A%2F%2Fthirdwx.qlogo.cn%2Fmmopen%2Fvi_32%2FQ0j4TwGTfTKqZsiaO21zTvg5dh0srpyZq6rNLQ0TvCR1AsS08L8icP2kjtLGntFo4GHLaVy1xvuCThz0VYz1n8wQ%2F132&nickname=a_%E9%9D%96&openid=oISUiuGZToTMlSkRKs2QUllYV1W0&ac_id="+ac_id;
			}

			function scc_share(){
				console.log('分享了')
				var share_date = getNowTime();
				var data={
					openid,nickname,headimgurl,share_date
				}
				var url ="https://jayjing.wang/wx_h5_jssdk_fenxiang/addS.php";
				console.log('分享接口---提交',data)
				$.ajax({
					type: 'post',
					url: url,
					contentType: 'application/x-www-form-urlencoded;charset=utf-8',
					data: data,
					dataType: "json",
					complete: res => {
						console.log('分享接口---res',res)
					}
				})
			}
			console.log('wx.config',appId,timestamp,nonceStr,signature);
			wx.config({
				debug: false, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
				appId: appId, // 必填,公衆號的唯一標識
				timestamp:  timestamp+"", // 必填,生成簽名的時間戳
				nonceStr: nonceStr+"", // 必填,生成簽名的隨機串
				signature: signature, // 必填,簽名
				jsApiList: [
  'updateAppMessageShareData',
  'updateTimelineShareData',
  'onMenuShareAppMessage',
  'onMenuShareQQ',
  'onMenuShareQZone',
  'onMenuShareTimeline' ] // 必填,需要使用的JS接口列表
			});
			wx.ready(function() {
				console.log('wx.ready')
			var wx_title =$('#wx_title').val();
			var wx_desc =$('#wx_desc').val();
			var wx_link =$('#wx_link').val();
			var wx_icon =$('#wx_icon').val();
			
			wx_link= "https://jayjing.wang/wx_h5_jssdk_fenxiang/shareArticle.php?appid=wxd9c832f1bafb383d&headimgurl=http%3A%2F%2Fthirdwx.qlogo.cn%2Fmmopen%2Fvi_32%2FQ0j4TwGTfTKqZsiaO21zTvg5dh0srpyZq6rNLQ0TvCR1AsS08L8icP2kjtLGntFo4GHLaVy1xvuCThz0VYz1n8wQ%2F132&nickname=a_%E9%9D%96&openid=oISUiuGZToTMlSkRKs2QUllYV1W0&ac_id="+ac_id;
			
			console.log('wx_title-----', wx_title)
				// wx.updateAppMessageShareData({ 
				//     title:wx_title, // 分享標題
				//     desc:wx_desc, // 分享描述
				//     link:wx_link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
				//     imgUrl:wx_icon, // 分享圖標
				//     success: function () {
				// 		scc_share()
				//       // 設置成功
				//     }
				//   })
				//   wx.updateTimelineShareData({ 
				//       title:wx_title, // 分享標題
				//       link:wx_link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
				//       imgUrl:wx_icon, // 分享圖標
				//       success: function () {
				// 		  scc_share()
				//         // 設置成功
				//       }
				//     })
				wx.onMenuShareAppMessage({
					  title:wx_title, // 分享標題
					  desc:wx_desc, // 分享描述
					  link:wx_link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
					  imgUrl:wx_icon, // 分享圖標
					  type: '', // 分享類型,music、video或link,不填默認爲link
					  dataUrl: '', // 如果type是music或video,則要提供數據鏈接,默認爲空
					  success: function () {
						  		scc_share()
						// 用戶點擊了分享後執行的回調函數
					  }
					});
					wx.onMenuShareTimeline({
					  title:wx_title, // 分享標題
					  link:wx_link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
					  imgUrl:wx_icon, // 分享圖標
					  success: function () {
						  console.log('分享到朋友圈成功')
					  // 用戶點擊了分享後執行的回調函數
					  scc_share()
					  },fial:function(){
						  console.log('分享到朋友圈sb')
					  }
					})
					wx.onMenuShareQQ({
					  title:wx_title, // 分享標題
					  desc:wx_desc, // 分享描述
					  link:wx_link, // 分享鏈接
					  imgUrl:wx_icon, // 分享圖標
					  success: function () {
					  // 用戶確認分享後執行的回調函數
					  },
					  cancel: function () {
						  scc_share()
					  // 用戶取消分享後執行的回調函數
					  }
					});
					wx.onMenuShareWeibo({
					  title:wx_title, // 分享標題
					  desc:wx_desc, // 分享描述
					  link:wx_link, // 分享鏈接
					  imgUrl:wx_icon, // 分享圖標
					  success: function () {
						  scc_share()
					  // 用戶確認分享後執行的回調函數
					  },
					  cancel: function () {
					  // 用戶取消分享後執行的回調函數
					  }
					});
					wx.onMenuShareQZone({
					  title:wx_title, // 分享標題
					  desc:wx_desc, // 分享描述
					  link:wx_link, // 分享鏈接
					  imgUrl:wx_icon, // 分享圖標
					  success: function () {
						  scc_share()
					  // 用戶確認分享後執行的回調函數
					  },
					  cancel: function () {
					  // 用戶取消分享後執行的回調函數
					  }
					});
			});
			wx.error(function(res) {
				console.log('wx.error', res)
				// config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
			});
			// 獲得當前時間 2019-02-02 14:06:08
			        function getNowTime() {
			            // 加0
			            function add_10(num) {
			                if (num < 10) {
			                    num = '0' + num
			                }
			                return num;
			            }
			            var myDate = new Date();
			            myDate.getYear(); //獲取當前年份(2位)
			            myDate.getFullYear(); //獲取完整的年份(4位,1970-????)
			            myDate.getMonth(); //獲取當前月份(0-11,0代表1月)
			            myDate.getDate(); //獲取當前日(1-31)
			            myDate.getDay(); //獲取當前星期X(0-6,0代表星期天)
			            myDate.getTime(); //獲取當前時間(從1970.1.1開始的毫秒數)
			            myDate.getHours(); //獲取當前小時數(0-23)
			            myDate.getMinutes(); //獲取當前分鐘數(0-59)
			            myDate.getSeconds(); //獲取當前秒數(0-59)
			            myDate.getMilliseconds(); //獲取當前毫秒數(0-999)
			            myDate.toLocaleDateString(); //獲取當前日期
			            var nowTime = myDate.getFullYear() + '-' + add_10(myDate.getMonth()+1) + '-' + myDate.getDate() + ' ' + add_10(myDate.getHours()) + ':' + add_10(myDate.getMinutes()) + ':' + add_10(myDate.getSeconds());
			            return nowTime;
			        }
		</script>
	</body>
</html>

完成

php結合html版本

<?php
    header("Content-Type:text/html;charset=utf8"); 
	header("Access-Control-Allow-Origin: *"); //解決跨域
	header('Access-Control-Allow-Methods:GET');// 響應類型  
	header('Access-Control-Allow-Headers:*'); // 響應頭設置 
	$appid = "wx9025b8efd9a17681";
	$secret = "90b3c06746e455ae7f128981eb9f267f";
	
	$servername = "localhost";
	$username = "root";
	$password = "root";
	$dbname = "demo";
	 
	// 創建連接
	$conn = new mysqli($servername, $username, $password, $dbname);
	// Check connection
	if ($conn->connect_error) {
	    die("連接失敗: " . $conn->connect_error);
	} 
	 
	$sql = "SELECT access_token_, _time, wx_card_ticket, jsapi_ticket FROM js_sdk";
	$result = $conn->query($sql);
	 
	if ($result->num_rows > 0) {
	    // 輸出數據
	    while($row = $result->fetch_assoc()) {
			if(number_format(time()-$row["_time"]>7200)){
				$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
				$s = file_get_contents($url);
				$s = json_decode($s, true);
				$access_token =$s['access_token'];
				
				$url_b = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
				$data = file_get_contents($url_b);
				$data = json_decode($data, true);
				$jsapi_ticket = $data['ticket'];
				
				$wx_card_url_b = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=wx_card";
				$wx_card_data = file_get_contents($wx_card_url_b);
				$wx_card_data = json_decode($wx_card_data, true);
				$wx_card_ticket = $wx_card_data['ticket'];
				
				$__time = $row["_time"];
				$_time = time();
				
				//echo $_time. "<br>".$jsapi_ticket. "<br>".$access_token. "<br>".$wx_card_ticket. "<br>";
				$m_sql ="UPDATE js_sdk SET _time = $_time, jsapi_ticket = '$jsapi_ticket', access_token_ = '$access_token', wx_card_ticket = '$wx_card_ticket'";
				mysqli_query($conn,$m_sql);

				mysqli_close($conn);

				// 進行sha1簽名
				$timestamp = time();
				$nonceStr = createNonceStr();
				
				// 注意 URL 一定要動態獲取,不能 hardcode.
				$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
				$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
				// $url = "https://jayjing.wang/wx_h5_jssdk_card/index.html";
				
				$str = "jsapi_ticket={$jsapi_ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
				$signature = sha1($str);
				
				$signPackage = array(
				    "appId" =>  $appid,
				    "nonceStr" => $nonceStr,
				    "timestamp" => $timestamp,
				    "signature" => $signature,
					"access_token"=>$access_token,
					"url"=>$url,
					"jsapi_ticket"=>$jsapi_ticket,
					"string1"=>$str,
					"wx_card_ticket"=>$wx_card_ticket,
					"_type"=>"db"
				);
				// echo urldecode(json_encode($signPackage));
			}else{
				
				$access_token =$row['access_token_'];
				$jsapi_ticket =$row['jsapi_ticket'];
				$wx_card_ticket =$row['wx_card_ticket'];
				// 進行sha1簽名
				$timestamp = time();
				$noncestr = createNonceStr();
				
				// 注意 URL 一定要動態獲取,不能 hardcode.
				$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
				$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
				// $url = "https://jayjing.wang/wx_h5_jssdk_card/index.html";
				
				$str = "jsapi_ticket={$jsapi_ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
				$signature = sha1($str);
						
				$signPackage = array(
				    "appId" =>  $appid,
				    "nonceStr" => $nonceStr,
				    "timestamp" => $timestamp,
				    "signature" => $signature,
					"access_token"=>$access_token,
					"url"=>$url,
					"string1"=>$str,
					"jsapi_ticket"=>$jsapi_ticket,
					"wx_card_ticket"=>$wx_card_ticket,
					"_type"=>"low"
				);
				
				// echo urldecode(json_encode($signPackage));
			}
	    }
	} else {
	    echo "0 結果";
	}
	$conn->close();
       
				//隨機字符串
				function createNonceStr($length = 16) {
					$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
					$str = "";
					for ($i = 0; $i < $length; $i++) {
						$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
					}
					return $str;
				}
?>
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>測試</title>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />

		<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
		<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
		<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
		<script type="text/javascript" src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
		<script>
			new VConsole();
		</script>
		<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

		<style type="text/css">
			.toast {
				padding: 10px 25px 10px 25px;
				background: rgba(0, 0, 0, .5);
				border-radius: 5px;
				color: #ffffff;
				text-align: center;
				position: fixed;
				left: 50%;
				top: 40%;
				transform: translate(-50%, -50%);
				z-index: 100;
			}
		</style>
	</head>
	<body>
		<div id="test">
			<toast v-if='isShow' :message='isShowMsg'></toast>
			<div class="container" @click="showToast">
				點擊顯示 showToast1
			</div>
			<input type="text" id="appId" name="text1" value="<?=$appid?>">
			<input type="text" id="wx_card_ticket" name="text1" value="<?=$wx_card_ticket?>">
			<input type="text" id="timestamp" name="text1" value="<?=$timestamp?>">
			<input type="text" id="nonceStr" name="text1" value="<?=$nonceStr?>">
			<input type="text" id="signature" name="text1" value="<?=$signature?>">
		</div>
		<script>
			var that;
			Vue.component('toast', {
				props: ['message'],
				template: `
			    <div class="toast_bg_transparent">
			        <div class="toast">
			            <span>{{message}}</span>
			        </div>
			    </div>
			    `
			})
			new Vue({
				el: '#test',
				data() {
					return {
						isShow: false,
						isShowMsg: '', //彈窗提示
					}
				},
				methods: {
					getConfig() {
						console.log('getConfig')
						var that = this;
						setTimeout(function(){
									console.log('22222222222')
							var wx_card_ticket = $('#wx_card_ticket').val();
						var appId = $('#appId').val();
						var timestamp = $('#timestamp').val();
						var nonceStr = $('#nonceStr').val();
						var signature = $('#signature').val();
						console.log('signature',signature)
								wx.config({
									debug: true, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
									  appId: appId, // 必填,公衆號的唯一標識
									  timestamp: timestamp, // 必填,生成簽名的時間戳
									  nonceStr: nonceStr, // 必填,生成簽名的隨機串
									  signature: signature,// 必填,簽名
									  jsApiList: ["addCard"] // 必填,需要使用的JS接口列表
								});
								wx.ready(function() {
									console.log('wx.ready')
									
									  
									that.addCard(wx_card_ticket);
								});
								wx.error(function(res){
									console.log('wx.error',res)
								  // config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
								});
						},1500)
						
					},
					addCard(wx_card_ticket) {
						var timestamp = new Date().getTime();
						var data={
							timestamp,wx_card_ticket
						}
						var url ="https://jayjing.wang/wx_h5_jssdk_card/addCard.php";
						$.ajax({
							type: 'post',
							url: url,
							contentType: 'application/x-www-form-urlencoded;charset=utf-8',
							data: data,
							dataType: "json",
							complete: res => {
								console.log('---res--',res)
								var signature = res.responseText;
								// var cardExt ='{timestamp:1586169935692,signature:5671ad079de93ef9698400f0943d3fc87adeb48d}'
								var cardExt ='{timestamp:'+timestamp+',signature:'+signature+'}'
								wx.addCard({
								  cardList: [{
									cardId: 'p_EZdwPj7zGD9dACk4If4sO1cONk',
									cardExt: cardExt
								  }], // 需要添加的卡券列表
								  success: function (ress) {
									var cardList = ress.cardList; // 添加的卡券列表信息
									console.log('addCard', ress)
								  },fail:function(err){
									 console.log('addCard-err', err) 
								  }
								});
							}
						})
					},

					getAccess_token() {
						console.log('getAccess_token')
						var that = this;
						var url = 'https://jayjing.wang/wx_h5_jssdk_card/getAccess_token.php';
						$.ajax({
							url: url,
							complete: res => {
								var getAccess_token = JSON.parse(res.responseText)
								console.log('getAccess_token', getAccess_token)
							}
						})
					},
					showToast() {
						console.log('點擊了 showToast')
						this.isShow = true;
						this.isShowMsg = '錯誤提示';

						setTimeout(() => {
							this.isShow = false;
						}, 1000);
					}
				},
				mounted() {
					var that = this;
					this.getConfig()
					// this.createCard()
					
				}
			})
		</script>
	</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章