程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php微信支付(僅Jsapi支付)詳細步驟.----僅適合第一次做微信開發的程序員,jsapi.----

php微信支付(僅Jsapi支付)詳細步驟.----僅適合第一次做微信開發的程序員,jsapi.----

編輯:關於PHP編程

php微信支付(僅Jsapi支付)詳細步驟.----僅適合第一次做微信開發的程序員,jsapi.----


本人最近做了微信支付開發,是第一次接觸.其中走了很多彎路,遇到的問題也很多.為了讓和我一樣的新人不再遇到類似的問題,我把我的開發步驟和問題寫出來,以供參考.

開發時間是2016/8/2,所以微信支付的版本也是對應此時的版本.

一.前期准備:

首先你們公司開通微信支付功能後,會收到一份郵件,裡面有賬戶相關信息,一般有:微信支付商戶號,商戶平台登錄帳號,商戶平台登錄密碼,申請對應的公眾號,公眾號APPID。

1.下載demo:用上面信息登陸“微信商戶平台”,>>>(右上角開發文檔)>>>公眾號支付>>>sdk下載>>>選php

2.下載證書:賬戶中心>>>api安全

    將下載的證書中的所有文件解壓到demo的cert文件夾中(demo原先自帶的要刪掉),然後修改demo中lib/WxPay.Config.php中的以下配置
  const APPID = '郵件中有,`公眾號APPID`';
  const MCHID = '郵件中有,`微信支付商戶號`';
  const KEY = 'wxpay.config.php中注釋有相關鏈接';
  const APPSECRET = '公眾平台開發者中心設置,同樣注釋中有鏈接';

3.配置好後去微信公眾平台,裡面有微信支付功能如下圖.在開發配置中設置支付目錄和測試目錄.這裡主要是配置測試目錄,支付目錄可以先不管(我的域名是www.test.com),然後將自己的微信號加入測試白名單.

 

 

    4.再去微信公眾平台>>>開發>>>接口權限>>>網頁服務的第一項`網頁賬號`,修改它的值為你自己的域名(僅僅是域名).如圖:

 

 

 

二.demo代碼修改(僅僅針對當前的版本):

     1.  修改文件WxPay.Api.php

   將curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

       curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
   改為:

       curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

       curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//嚴格校驗2

 

   2.   如果訪問jsapi.php時你要用get方式傳遞參數,那麼你要去修改WxPay.JsapiPay.php中的

       $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);

   改為:

       $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);

   或者在寫鏈接時寫兩個??傳參,例如:http://www.test.com/demo/example/jsapi.php??id=xxx&...

 

 3.刪去wxpay.notify.php中的ReplyNotify函數中$this->GetReturn_code(‘參數’) == "SUCCESS"裡面的’參數’.
 

三.開始開發,按大概流程講述:

    1.支付:首先點擊支付後,會到jsapi.php文件中去,獲取openid,這步我沒管,也沒出錯;

   然後是統一下單,他會設置一大堆參數,如圖:

   將裡面的setNotify_url設置為你的notify.php文件所在的位置.

   其中的setOut_trade_no和setTotal_fee這兩個參數是你可以隨便填寫的(其他參數默認可以).在支付成功後微信服務器會將這兩個參數的值返回給你.我是直接將商品訂單號碼放到setOut_trade_no中傳遞過去.在這一步,我遇到的問題是,get過來的字符串參數總是放不到setOut_trade_no中,最後我發現傳過來的訂單字符串被莫名奇妙的加上了單引號.於是我接收到字符串後先用trim函數處理,然後就能放入了.

   此時點擊支付,應該可以去支付了.(支付的結果在商戶平台中查看)

 

  2.支付成功後的返回:支付完成後,微信服務器會自動請求你的notify.php文件.但是請求進入後直接通過最後一句$notify->Handle(false);跳到了WxPay.notify.php中,然後還調用了很多其他函數,整個過程我只處理了兩個函數.

     ①WxPay.api.php中的notify函數,如圖:

 這裡面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'];就是支付成功後用戶返回給你的一個結果,他是一個xml格式的字符串.調試的時候可以將它輸入到文件查看(結果是重復的,因為微信服務器會重復請求多次).$xml輸出結果如圖:
 其中的$out_trade_no就是在支付之前我自己設置的訂單號碼.接下來我們想辦法得到這個訂單號,然後我就直接在下面寫支付成功後的邏輯了,如改變數據庫中的數據等等.
 這個函數內其他的代碼我沒有管,只是最後一句return call_user_func($callback, $result);我直接改為return true;了.如果使用return call_user_func($callback, $result);就會有多次請求.
 ②.WxPay.api.php中的replyNotify函數,這個函數就是用來阻止微信服務器重復請求你的notify.php文件的,如圖:
 查看完整個handle函數的調用過程後,會發現最後執行的就是這個函數.他的輸出結果(echo $xml)就是notify.php文件中最後一句handle函數的結果.$xml的內容是什麼呢?
 內容如圖:
 可以看到$xml是一個xml格式字符串,他就是文檔中說的返回給微信服務器的內容.所以我們不用做其他額外的返回操作了,微信自己就有返回結果的方法.
 一開始做什麼都不懂,全是看別人的文章,在這一步看好多人說直接輸出success,return success,或者寫入流,等等,都沒有成功,總是被請求多次.後來狠心看了代碼,發現竟然有現成的.

四.支付後跳轉
支付完成後,手機提示支付成功,並會顯示支付信息,點擊手機上的完成,頁面可以跳轉到你設置的頁面.設置的地方是在jsapi.php文件中的jsApiCall函數中,我直接設置為跳轉到百度.你設置為自己想要跳轉到的頁面路徑即可.

至此,一個支付流程大致走完了,唯一的感覺就是覺的這個結果是自己七拼八湊蒙出來的,好暈.

 

題外:

微信支付的問題很多:

1.       demo代碼有一堆錯誤

2.       文檔很亂,講的稀裡糊塗,不夠精確.

3.       官方給出的支付流程圖很多字看不清楚,細看流程圖發現竟然沒有第三步,直接第二步過去,回來就成了第四步了

4.       微信支付後沒有短信提示(這是最可怕的)

5.       手機微信綁定銀行卡後,我僅僅是用來做開發測試的,每次支付0.01元,但是期間竟有一筆66元的支出,短信不提醒,查看支付細節要求我升級微信版本,升級微信時,提示不支持新版本……

6.       鑒於上面的問題,我很懷疑微信支付的業務邏輯會不會有問題(可能性很大,畢竟連官方demo都能出錯).

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved