本文是自己做微信支付的一點心得,對於想做微信支付的開發者應該有些許幫助,有寫的不對的地方還請見諒。
與微信建立連接
在日常使用微信的過程中,或多或少會接觸到一些在微信公衆號裏付錢的操作,比如手機充錢,京東微信商城購物等。當點擊公衆號下面菜單的鏈接跳轉到網上商城時,我們發現其實鏈接到的是商家自己的h5網站,賣什麼東西怎麼賣是商家自己進行維護(微信提供了網站的入口與便捷的支付功能)。那麼怎麼才能實現公衆號與h5網站的連接呢?
對於動手黨來說,肯定是想立馬建立一個屬於自己的公衆號看看效果,那麼你可以先看這篇文章(不包含微信支付),如果實現文章裏面的那些案例沒有問題,那麼可以跳過這部分了。http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
/**
* 驗證訪問正確性
*/
private function CheckSignature() {
//微信調用帶過來的3個參數
$signature = $_GET["signature"]; //加密的字符串
$timestamp = $_GET["timestamp"]; //時間戳
$nonce = $_GET["nonce"]; //隨機字符串
$echostr = $_GET["echostr"]; //如果是在公衆號裏設置調用url時,會有個參數
//將$token,$timestamp,$nonce拼接在一起使用sha1加密
$token = TOKEN; //這個是設置的密鑰
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
//如果加密出來的信息與微信過來的信息一致則進行後續處理
if ($tmpStr == $signature) {
//如果是設置調用url,則原樣返回echostr即可
if ($echostr) {
echo $echostr;
exit(0);
}
//如果是用戶與公衆號正常互動,繼續處理
$this->DelMsg();
} else {
exit(0);
}
}
在驗證了訪問的正確性後,就可以解析微信post過來的參數了,根據不同的消息類別可以進行不同的回覆,下面以文本消息來實現一個回覆與用戶發送相同信息的例子。/**
* 根據信息類型處理信息
*/
private function DelMsg() {
//微信post過來的參數
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
//將格式化的xml字符串轉化成對象
self::$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
}
//判斷對象是否解析成功
if (is_object(self::$postObj)) {
//MsgType爲消息的類型
//更多類型查看http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
$msgType = trim(self::$postObj->MsgType);
switch ($msgType) {
case "text":
$content = self::$postObj->Content;
break;
default:
$content = '';
break;
}
echo $this->transmitText(self::$postObj, $content);
} else {
echo '';
exit(0);
}
}
/**
* 回覆文本消息
* @param type $object 微信post對象
* @param type $content 文本消息
* @return type
*/
private function transmitText($object, $content) {
//回覆消息的模板
//更多模板查看http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
如果上面處理的沒錯的話,那麼就可以看到如下的效果了:發送了【今天天氣真好】微信回覆了【今天天氣真好】
公衆號支付
<span style="white-space:pre"> </span>//調用微信JSApi支付
function WeiXinPay(data) {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", //公衆號ID,可以在【基本配置】裏看到
"timeStamp": " 1395712654", //時間戳,time()
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", //32位隨機串
"package": "prepay_id=u802345jgfjsdfgsdg888",//上面步驟獲取到的預支付ID
"signType": "MD5", //微信簽名方式:
"paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名,同統一下單簽名規則
},
function(res) {
WeixinJSBridge.log(res.err_msg);
//如果付款成功的話
if (res.err_msg == 'get_brand_wcpay_request:ok') {
hideorshow('paysuccess');
$('title').text('支付成功');
}
}
);
}