微信掃碼支付模式二【沒法回調】解決方案(轉)

微信支付官方demo下載地址 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1php

我修改後的demo http://download.csdn.net/detail/lhat_7/9821931html

官方demo的目錄結構以下:jquery

我在本地環境下使用微信支付官方demo過程當中遇到的問題有:ajax

問題1json

將 /lib/WxPay.Api.php 函數 postXmlCurl 中的兩行代碼api

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微信

訪問  http://localhost/weixin/WxpayAPI_php_v3/example/native.php  時的錯誤提示curl

根據錯誤提示知道:"未定義的索引" 錯誤出在  /exaple/native.php 的 42 行,函數

顯而易見,是變量 $result 中沒有定義 code_url。打印變量 $result: echo "<pre>";print_r($result);exit(); 

Array
(
    [return_code] => FAIL
    [return_msg] => invalid spbill_create_ip
)

參數 spbill_create_ip 在  /lib/WxPay.Api.php  的53行

打印出變量  $_SERVER['REMOTE_ADDR'] ,發現是  ::1 ,這明顯是一個無效的ip地址

//獲取請求地址

View Code

 將上面的函數添加到類WxPayApi後,修改以下

$inputObj->SetSpbill_create_ip(self::real_ip());//終端ip      
//$inputObj->SetSpbill_create_ip("1.1.1.1");      

再次訪問  http://localhost/weixin/WxpayAPI_php_v3/example/native.php ,出如今眼前的頁面以下

手機微信掃支付模式二的二維碼,支付1分錢,好的,大功告成,^_^!

問題3

且慢,還有回調地址沒處理呢?對,對,對。差點忘記了最重要的 notify_url,它是專門來告訴咱們支付結果的。

參數notify_url是在  /example/native.php  中設置的

設置好正確的回調地址,所謂正確的地址必須在微信公衆號設置的支付受權目錄(或測試受權目錄)下,且域名要和微信公衆號綁定的服務器地址域名相同。

若是此處的 notify_url 地址填寫爲  http://localhost/weixin/WxpayAPI_php_v3/example/notify.php  ,你以爲微信服務器會向這個回調地址發送消息嗎?(不巧的是,我就犯過這個愚蠢的錯誤,還滿心歡喜的覺得本地環境下也能夠微信掃碼支付,又滿腔憤懣的說微信支付成功後沒法回調)

 

 

雖然微信毫不可能向本地地址發送消息,但微信還提供了另外一個接口,能夠讓咱們在本地環境下得知微信掃碼支付的結果。

既然微信不主動告知咱們支付成功,那咱們還不能主動去問嗎?問誰,固然是微信了。

訪問  http://localhost/WxpayAPI_php_v3/example/orderquery.php ,輸入 商戶訂單號(即out_trade_no),點擊查詢

 

思路:掃碼頁面用js定時ajax去獲取支付結果,當檢測到支付成功後,跳轉到回調頁面notify_url進行業務處理。

在  /example/native.php  的html裏添加這樣一段代碼

複製代碼
<input type="hidden" name="out_trade_no" id="out_trade_no" value="<?php echo $out_trade_no;?>" />
<script src="assets/js/jquery-1.9.1.min.js"></script>
<script>
    $(function(){
       setInterval(function(){check()}, 5000);  //5秒查詢一次支付是否成功
    })
    function check(){
        var url = "http://localhost/WxpayAPI_php_v3/example/orderquery2.php";  //新建
        var out_trade_no = $("#out_trade_no").val();
        var param = {'out_trade_no':out_trade_no};
        $.post(url, param, function(data){
            data = JSON.parse(data);
            if(data['trade_state'] == "SUCCESS"){
                alert(JSON.stringify(data));
                alert("訂單支付成功,即將跳轉...");
                window.location.href = "http://localhost/WxpayAPI_php_v3/index.php";
            }else{
                console.log(data);
            }
        });
    }
</script>
複製代碼

新建一個  /example/orderquery2.php ,用來查詢支付結果,代碼以下

複製代碼
 1     <?php
 2     ini_set('date.timezone','Asia/Shanghai');
 3     error_reporting(E_ERROR);
 4     require_once "../lib/WxPay.Api.php";
 5     require_once 'log.php';
 6 
 7     //初始化日誌
 8     $logHandler= new CLogFileHandler("./logs/".date('Y-m-d').'.log');
 9     $log = Log::Init($logHandler, 15);
10 
11     if(isset($_REQUEST["transaction_id"]) && $_REQUEST["transaction_id"] != ""){
12         $transaction_id = $_REQUEST["transaction_id"];
13         $input = new WxPayOrderQuery();
14         $input->SetTransaction_id($transaction_id);
15         echo json_encode(WxPayApi::orderQuery($input));
16         exit();
17     }
18 
19     if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
20         $out_trade_no = $_REQUEST["out_trade_no"];
21         $input = new WxPayOrderQuery();
22         $input->SetOut_trade_no($out_trade_no);
23         echo json_encode(WxPayApi::orderQuery($input));
24         exit();
25     }
26     ?>

 

 
 
轉自: https://www.cnblogs.com/lhat/p/5611242.html
相關文章
相關標籤/搜索