基於php的微信支付(PHP微信支付)

本文目錄一覽:

如何用PHP實現微信支付,求教。新手!說明詳細點

這類專業的技術問題,建議您可以下載一下開發者文檔

該文檔在您申請了微信商家之後就可以下載的

然後根據文檔裡面的技術規範進行調整和開發

如何用PHP實現微信支付?

以PHP語言為例,對微信支付的開發流程進行一下說明:

1.獲取訂單信息。

2.根據訂單信息和支付相關的賬號生成sign,並且生成支付參數。

3.將支付參數信息POST到微信伺服器,獲取返回信息。

4.根據返回信息生成相應的支付代碼(微信內部)或是支付二維碼(非微信內),完成支付。

PHP實現微信掃碼支付怎麼做,微信的demo報錯咋搞?

微信掃碼首先你要確定幾個步驟:

1申請了微信支付,獲得到微信支付所需要的appid和秘鑰

2有正確的回調地址,就是需要外網ip地址接收回調信息

3如果以上都滿足,剩下來的才是代碼的問題,這個時候需要考慮比如版本問題,路徑問題,配置信息問題,各個可能得問題,然後開啟php的啊錯誤信息,對報錯問題具體分析。

如何利用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如何實現微信支付 求指教 新手!說清楚一點

通知機制的實現,官方只有文檔沒有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之外為空外,其它情況都可能不為空

以上轉述這麼多文字的意思,就是說,得用到這兩種方式來讀取微信傳過來的數據。 ..

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231980.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 01:08
下一篇 2024-12-11 01:08

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台伺服器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種資料庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論