|
導讀微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺... 微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺通過網絡快速發送免費(需消耗少量網絡流量)語音短信、視頻、圖片和文字,同時,也可以使用通過共享流媒體內容的資料和基于位置的社交插件“搖一搖”、“漂流瓶”、“朋友圈”、”公眾平臺“、”語音記事本“等服務插件。 當今用APP微信支付已經成為了主流的支付模式,下面小編將為大家介紹一篇通過PHP實現APP微信支付的實例講解,簡單易學,一起跟小編學習APP微信支付吧。一、PHP后臺后臺生成預支付交易單,返回正確的預支付交易回話標識后再在APP里面調起支付! 官方文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 根據文檔拼接微信需要的參數,這里需要幾個方法,直接上代碼! 傳輸給微信的參數要組裝成xml格式發送,傳如參數數組! public function ToXml($data=array())
{
if(!is_array($data) || count($data) <= 0)
{
return '數組異常';
}
$xml = "<xml>";
foreach ($data as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}2.生成隨機字符串,微信所需參數! 這里方法很多,看自己愛好都行! function rand_code(){
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62個字符
$str = str_shuffle($str);
$str = substr($str,0,32);
return $str;
}3.這里是微信比較重要的一步了,這個方法會多次用到!生成簽名 private function getSign($params) {
ksort($params); //將參數數組按照參數名ASCII碼從小到大排序
foreach ($params as $key => $item) {
if (!empty($item)) { //剔除參數值為空的參數
$newArr[] = $key.'='.$item; // 整合新的參數數組
}
}
$stringA = implode("&", $newArr); //使用 & 符號連接參數
$stringSignTemp = $stringA."&key="."************************"; //拼接key
// key是在商戶平臺API安全里自己設置的
$stringSignTemp = MD5($stringSignTemp); //將字符串進行MD5加密
$sign = strtoupper($stringSignTemp); //將所有字符轉換為大寫
return $sign;
}4.傳遞參數給微信,生成預支付訂單! 接收微信返回的數據,在反給APP端,APP端調用支付接口,完成支付 ! APP端所需參數見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2 public function wx_pay() {
$nonce_str = $this->rand_code(); //調用隨機字符串生成方法獲取隨機字符串
$data['appid'] ='wxdbc5dc*******'; //appid
$data['mch_id'] = '1493*****' ; //商戶號
$data['body'] = "APP支付測試";
$data['spbill_create_ip'] = $_SERVER['HTTP_HOST']; //ip地址
$data['total_fee'] = 1; //金額
$data['out_trade_no'] = time().mt_rand(10000,99999); //商戶訂單號,不能重復
$data['nonce_str'] = $nonce_str; //隨機字符串
$data['notify_url'] = 'http://xxx.xxx.com/wx_notify'; //回調地址,用戶接收支付后的通知,必須為能直接訪問的網址,不能跟參數
$data['trade_type'] = 'APP'; //支付方式
//將參與簽名的數據保存到數組 注意:以上幾個參數是追加到$data中的,$data中應該同時包含開發文檔中要求必填的剔除sign以外的所有數據
$data['sign'] = $this->getSign($data); //獲取簽名
$xml = $this->ToXml($data); //數組轉xml
//curl 傳遞給微信方
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//header("Content-type:text/xml");
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
} else {
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
}
//設置header
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求結果為字符串且輸出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//設置超時
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, TRUE);
//傳輸文件
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//運行curl
$data = curl_exec($ch);
//返回結果
if($data){
curl_close($ch);
//返回成功,將xml數據轉換為數組.
$re = $this->FromXml($data);
if($re['return_code'] != 'SUCCESS'){
json("201",'簽名失敗');
}
else{
//接收微信返回的數據,傳給APP!
$arr =array(
'prepayid' =>$re['prepay_id'],
'appid' => 'wxdbc5dc*****',
'partnerid' => '14937****',
'package' => 'Sign=WXPay',
'noncestr' => $nonce_str,
'timestamp' =>time(),
);
//第二次生成簽名
$sign = $this->getSign($arr);
$arr['sign'] = $sign;
json('200','簽名成功',$arr);
}
} else {
$error = curl_errno($ch);
curl_close($ch);
json('201',"curl出錯,錯誤碼:$error");
}
}5.將xml數據轉換為數組,接收微信返回數據時用到. public function FromXml($xml)
{
if(!$xml){
echo "xml數據異常!";
}
//將XML轉為array
//禁止引用外部xml實體
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}二、APP支付成功后,會調用你填寫的回調地址. 返回參數詳見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3 // 微信支付回調
function wx_notify(){
//接收微信返回的數據數據,返回的xml格式
$xmlData = file_get_contents('php://input');
//將xml格式轉換為數組
$data = $this->FromXml($xmlData);
//用日志記錄檢查數據是否接受成功,驗證成功一次之后,可刪除。
$file = fopen('./log.txt', 'a+');
fwrite($file,var_export($data,true));
//為了防止假數據,驗證簽名是否和返回的一樣。
//記錄一下,返回回來的簽名,生成簽名的時候,必須剔除sign字段。
$sign = $data['sign'];
unset($data['sign']);
if($sign == $this->getSign($data)){
//簽名驗證成功后,判斷返回微信返回的
if ($data['result_code'] == 'SUCCESS') {
//根據返回的訂單號做業務邏輯
$arr = array(
'pay_status' => 1,
);
$re = M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);
//處理完成之后,告訴微信成功結果!
if($re){
echo '<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';exit();
}
}
//支付失敗,輸出錯誤信息
else{
$file = fopen('./log.txt', 'a+');
fwrite($file,"錯誤信息:".$data['return_msg'].date("Y-m-d H:i:s"),time()."\r\n");
}
}
else{
$file = fopen('./log.txt', 'a+');
fwrite($file,"錯誤信息:簽名驗證失敗".date("Y-m-d H:i:s"),time()."\r\n");
}
}在這里,微信APP支付流程就成功走完了!謝謝支持! 以上就是PHP實現APP微信支付的具體方法了,通過小編的實例講解,相信大家已經掌握了。 相關推薦: 以上就是通過PHP來實現APP微信支付的實例分析的詳細內容,更多請關注php中文網其它相關文章! 微信提供公眾平臺、朋友圈、消息推送等功能,用戶可以通過“搖一搖”、“搜索號碼”、“附近的人”、掃二維碼方式添加好友和關注公眾平臺,同時微信將內容分享給好友以及將用戶看到的精彩內容分享到微信朋友圈。 |
溫馨提示:喜歡本站的話,請收藏一下本站!