Trong quá trình phát triển một dự án, tôi đã cần sử dụng tính năng chia sẻ của WeChat để tùy chỉnh tiêu đề, hình ảnh và mô tả khi chia sẻ.
Dưới đây là quy trình thực hiện:
<?php
require_once "jssdk.php";
$jssdk = new JSSDK("yourAppID", "yourAppSecret");
$signPackage = $jssdk->GetSignPackage();
?>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
/*
* Lưu ý:
* 1. Tất cả các API JS chỉ có thể được gọi trong miền được gắn với tài khoản công chúng. Người phát triển cần đăng nhập vào WeChat Developer Platform, vào phần "Cài đặt công chúng" -> "Tùy chọn nâng cao" để thiết lập "Miền an toàn cho JS API".
* 2. Nếu gặp lỗi không chia sẻ nội dung tùy chỉnh trên Android, hãy tải phiên bản mới nhất của SDK và cài đặt lại. Giao diện chia sẻ tùy chỉnh trên Android yêu cầu phiên bản SDK tối thiểu là 6.0.2.58.
* 3. Vấn đề thường gặp và tài liệu đầy đủ về JS-SDK: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
*
* Khi gặp lỗi trong quá trình phát triển, hãy tham khảo phần "Phụ lục 5 - Lỗi thường gặp và cách khắc phục". Nếu vẫn chưa giải quyết được, vui lòng phản hồi qua:
* Email: weixin-open@qq.com
* Tiêu đề email: 【Phản hồi WeChat JS-SDK】Vấn đề cụ thể
* Nội dung email: Mô tả ngắn gọn vấn đề và bối cảnh gặp phải, có thể đính kèm ảnh chụp màn hình. Đội ngũ WeChat sẽ xử lý phản hồi của bạn nhanh chóng.
*/
wx.config({
debug: true,
appId: '<?php echo $signPackage["appId"];?>',
timestamp: <?php echo $signPackage["timestamp"];?>,
nonceStr: '<?php echo $signPackage["nonceStr"];?>',
signature: '<?php echo $signPackage["signature"];?>',
jsApiList: [ // Thêm các API cần thiết vào danh sách
"onMenuShareTimeline", // Chia sẻ lên dòng thời gian
"onMenuShareAppMessage", // Chia sẻ tới nhóm bạn bè
"onMenuShareQQ", // Chia sẻ lên QQ
"onMenuShareWeibo", // Chia sẻ lên Weibo
"checkJsApi","scanQRCode", // Nếu cần dùng quét mã QR, thêm vào danh sách
]
});
wx.ready(function (){
var shareData = {
title: '{$user_info.card.name}', // Tiêu đề
desc: '{$user_info.card.company} Chia sẻ từ [ZhiXin Network]',// Mô tả, lưu ý loại bỏ thẻ HTML
link: '<?php echo $signPackage["url"];?>',
imgUrl: '{$user_info.avatar_img}'
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareWeibo(shareData);
});
</script>
</html>
Dưới đây là tệp jssdk.php của WeChat:
<?php
class JSSDK {
private $appId;
private $appSecret;
public function __construct($appId, $appSecret) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
public function getSignPackage() {
$jsapiTicket = $this->getJsApiTicket();
// URL phải được lấy động, không nên cứng mã.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this->createNonceStr();
// Các tham số phải được sắp xếp theo thứ tự ASCII
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
private 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;
}
private function getJsApiTicket() {
// jsapi_ticket nên được lưu trữ và cập nhật toàn cục, ví dụ dưới đây lưu vào file
$data = json_decode($this->get_php_file("jsapi_ticket.php"));
if ($data->expire_time < time()) {
$accessToken = $this->getAccessToken();
// Nếu dùng tài khoản doanh nghiệp, dùng URL sau để lấy ticket
// $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode($this->httpGet($url));
$ticket = $res->ticket;
if ($ticket) {
$data->expire_time = time() + 7000;
$data->jsapi_ticket = $ticket;
$this->set_php_file("jsapi_ticket.php", json_encode($data));
}
} else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
private function getAccessToken() {
// access_token nên được lưu trữ và cập nhật toàn cục, ví dụ dưới đây lưu vào file
$data = json_decode($this->get_php_file("access_token.php"));
if ($data->expire_time < time()) {
// Nếu dùng tài khoản doanh nghiệp, dùng URL sau để lấy access_token
// $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
$res = json_decode($this->httpGet($url));
$access_token = $res->access_token;
if ($access_token) {
$data->expire_time = time() + 7000;
$data->access_token = $access_token;
$this->set_php_file("access_token.php", json_encode($data));
}
} else {
$access_token = $data->access_token;
}
return $access_token;
}
private function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
// Để đảm bảo an toàn dữ liệu giữa máy chủ của bạn và WeChat Server, tất cả các API đều sử dụng HTTPS.
// Nếu gặp lỗi xác thực SSL tại đây, hãy truy cập http://curl.haxx.se/ca/cacert.pem để tải chứng chỉ mới.
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
private function get_php_file($filename) {
return trim(substr(file_get_contents($filename), 15));
}
private function set_php_file($filename, $content) {
$fp = fopen($filename, "w");
fwrite($fp, "<?php exit();?>" . $content);
fclose($fp);
}
}
Sau khi hoàn tất, tắt chế độ debug trong wx.config bằng cách đổi thành debug: false.
Xong!