本文目錄一覽:
- 1、PHP實現微信掃碼支付怎麼做,微信的demo報錯咋搞?
- 2、如何用PHP實現微信支付?
- 3、如何用PHP實現微信支付,求教。新手!說明詳細點
- 4、你好 !! PHP如何實現微信支付 求指教 新手!說清楚一點
- 5、如何利用PHP實現 APP端微信支付功能
- 6、PHP調用微信支付接口?
PHP實現微信掃碼支付怎麼做,微信的demo報錯咋搞?
微信掃碼首先你要確定幾個步驟:
1申請了微信支付,獲得到微信支付所需要的appid和秘鑰
2有正確的回調地址,就是需要外網ip地址接收回調信息
3如果以上都滿足,剩下來的才是代碼的問題,這個時候需要考慮比如版本問題,路徑問題,配置信息問題,各個可能得問題,然後開啟php的啊錯誤信息,對報錯問題具體分析。
如何用PHP實現微信支付?
以PHP語言為例,對微信支付的開發流程進行一下說明:
1.獲取訂單信息。
2.根據訂單信息和支付相關的賬號生成sign,並且生成支付參數。
3.將支付參數信息POST到微信服務器,獲取返回信息。
4.根據返回信息生成相應的支付代碼(微信內部)或是支付二維碼(非微信內),完成支付。
如何用PHP實現微信支付,求教。新手!說明詳細點
以PHP語言為例,對微信支付的開發流程進行一下說明:
1.獲取訂單信息。
2.根據訂單信息和支付相關的賬號生成sign,並且生成支付參數。
3.將支付參數信息POST到微信服務器,獲取返回信息。
4.根據返回信息生成相應的支付代碼(微信內部)或是支付二維碼(非微信內),完成支付。
你好 !! PHP如何實現微信支付 求指教 新手!說清楚一點
通知機制的實現,官方只有文檔沒有demo代碼,對沒搞過的人來說,需要花大量時間來做測試。
從文檔上說的來看,微信每次通知過來的數據,結構比較複雜,是一個多段數據,除了要取出POST數據外,還要取其它的數據。
這裡首先涉及到一個關於php://input與$_POST取值的問題,簡單列幾點如下:
1,Content- Type取值為application/x-www-form-urlencoded時,php會將http請求body相應數據會填入到數組$_POST,填入到$_POST數組中的數據是進行urldecode()解析的結果。(其實,除了該Content-Type,還有 multipart/form-data表示數據是表單數據,稍後我們介紹)
2,php://input數據,只要Content-Type不為 multipart/form-data(該條件限制稍後會介紹)。那麼php://input數據與http entity body部分數據是一致的。該部分相一致的數據的長度由Content-Length指定。
3,僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST數據與php://input數據才是」一致」(打上引號,表示它們格式不一致,內容一致)的。其它情況,它們都不一致。
4,php://input讀取不到$_GET數據。是因為$_GET數據作為query_path寫在http請求頭部(header)的PATH字段,而不是寫在http請求的body部分。
幫助我們了解了為什麼xml_rpc服務端讀取數據都是通過file_get_contents(『php://input’, 『r’)。
而不是從$_POST中讀取,正是因為xml_rpc數據規格是xml,它的Content-Type是text/xml。
5. php://input碰到了multipart/form-data,請查閱RFC1867對它的描述。multipart/form-data也表示以POST方法提交表單數據,它還伴隨了文件上傳,所以會跟application/x- www-form-urlencoded數據格式不一樣。它會以一更種更合理的,更高效的數據格式傳遞給服務端。當Content-Type為multipart/form-data的時候,即便http請求body中存在數據,php://input也為空,PHP此時,不會把數據填入php://input流。所以,可以確定: php://input不能用於讀取enctype=multipart/form-data數據。
6. 當Content-Type為application/x- www-form-urlencoded時,php://input和$_POST數據是「一致」的,為其它Content-Type的時候,php: //input和$_POST數據數據是不一致的。因為只有在Content-Type為application/x-www-form- urlencoded或者為multipart/form-data的時候,PHP才會將http請求數據包中的body相應部分數據填入$_POST全局變量中,其它情況PHP都忽略。而php://input除了在數據類型為multipart/form-data之外為空外,其它情況都可能不為空
以上轉述這麼多文字的意思,就是說,得用到這兩種方式來讀取微信傳過來的數據。 ..
如何利用PHP實現 APP端微信支付功能
一丶 PHP後台後台生成預支付交易單,返回正確的預支付交易回話標識後再在APP裏面調起支付!官方文檔:
根據文檔拼接微信需要的參數,這裡需要幾個方法,直接上代碼!
傳輸給微信的參數要組裝成xml格式發送,傳如參數數組!
public function ToXml($data=array())
{
if(!is_array($data) || count($data) = 0)
{
return ‘數組異常’;
}
$xml = “”;
foreach ($data as $key=$val)
{
if (is_numeric($val)){
$xml.=””.$key.””.$val.””;
}else{
$xml.=””.$key.””;
}
}
$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端所需參數見微信文檔:;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’] = ”; 接收支付後的通知,必須為能直接訪問的網址,不能跟參數
$data[‘trade_type’] = ‘APP’; //支付方式
//將參與簽名的數據保存到數組 注意:以上幾個參數是追加到$data中的,$data中應該同時包含開發文檔中要求必填的剔除sign以外的所有數據
$data[‘sign’] = $this-getSign($data); //獲取簽名
$xml = $this-ToXml($data); //數組轉xml
//curl 傳遞給微信方
$url = “”;
//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支付成功後,會調用你填寫的回調地址 . 返回參數詳見微信文檔:;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 ”;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調用微信支付接口?
不一定,看你業務需要。這些步驟只是描述微信系統會發出和接收什麼數據,商戶需要發送和會接收到什麼數據,用戶需要執行什麼操作。回調的URL是用來接收數據的,至於發送並沒有要求。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/283411.html