PHP WeChat-Zahlungsentwicklungsmethode für Rückruf nach dem Scannen der Zahlung (Modus 2)

高洛峰
Freigeben: 2017-03-09 15:40:37
Original
3415 Leute haben es durchsucht

Tatsächlich hatte ich das Gefühl, dass ich bereits hinter der Zeit zurückgeblieben war, als ich auf Baidu nach „WeChat-Zahlungsentwicklung – So rufen Sie nach dem Scannen der Zahlung zurück (Modus 2)“ suchte Als Antwort habe ich festgestellt, dass viele Freunde dieses Problem immer noch nicht gelöst haben, daher werde ich meine Lösungsideen mit allen teilen.

1. Laden Sie das WeChat-Zahlungs-SDK herunter (der Autor verwendet die PHP-Entwicklung als Beispiel, das SDK-Paket ist WxpayAPI_php_v3.zip)

Laden Sie das SDK-Paket herunter und entpacken Sie es im entpackten Verzeichnis. Wir sehen das folgende Verzeichnis

PHP WeChat-Zahlungsentwicklungsmethode für Rückruf nach dem Scannen der Zahlung (Modus 2)

2. Nachdem wir die Dokumentation des WeChat-Zahlungsentwicklers konsultiert haben, haben wir erfahren, dass die Demo der WeChat-Scancode-Zahlung die native.php-Datei im Beispiel ist Verzeichnis

Der Einfachheit halber müssen wir die gesamte dekomprimierte Datei im Ordner „wxpay“ (kann nach persönlichen Vorlieben benannt werden) im Stammverzeichnis der lokalen Umgebung ablegen

3 . Am Beispiel des Autors: Geben Sie http://localhost/wxpay/example/native.php in den Browser ein. Nachdem Sie die obige URL geöffnet haben, haben wir festgestellt, dass es zwei QR-Codes gibt Im Titel heißt es, was wir heute studieren, ist der Modus-2-Scan-Code (wird auch vom offiziellen Modus-2-Scan-Code zum Bezahlen empfohlen)

4. Wir melden uns mit unserem Mobiltelefon bei WeChat an und scannen den QR-Code von Modus 2 auf der Seite oben und bezahlen

Hier finden wir ein interessantes Problem: Nachdem Ihre Zahlung erfolgreich war, ändert sich nichts auf der PC-Seite. Daher ist das Hauptproblem, das wir berücksichtigen, die Frage, wie Sie nach der Zahlung zurückrufen können .

Ich werde hier nicht zu viel Unsinn reden. Der Autor hat auf viele Methoden im Internet verwiesen und sie wie folgt zusammengefasst:

1. Löschen Sie den Scancode-Modus 1 in der native.php-Datei, nur einige verwandte HTML-Codes im Scan-Code-Modus 2 sind übrig.

2. Da im offiziellen Dokument auch angegeben ist, dass das Zahlungsergebnis des Scancode-Modus 2 eine asynchrone Antwort ist und das Zahlungsergebnis nicht aktiv zurückgibt, verwenden wir von Zeit zu Zeit Javascript, um das Zahlungsergebnis zu überwachen. und dann basierend auf dem Ergebnis der Anfrage den nächsten Seitenrückruf durchführen. Der endgültige Code des Autors lautet wie folgt. Interessierte Freunde können darauf verweisen:

native.php-Datei

<?php
ini_set(&#39;date.timezone&#39;,&#39;Asia/Shanghai&#39;);
//error_reporting(E_ERROR);

require_once "../lib/WxPay.Api.php";
require_once "WxPay.NativePay.php";
require_once &#39;log.php&#39;;

//模式一
/**
 * 流程:
 * 1、组装包含支付信息的url,生成二维码
 * 2、用户扫描二维码,进行支付
 * 3、确定支付之后,微信服务器会回调预先配置的回调地址,在【微信开放平台-微信支付-支付配置】中进行配置
 * 4、在接到回调通知之后,用户进行统一下单支付,并返回支付信息以完成支付(见:native_notify.php)
 * 5、支付完成之后,微信服务器会通知支付成功
 * 6、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
 */
$notify = new NativePay();
$url1 = $notify->GetPrePayUrl("123456789");

//模式二
/**
 * 流程:
 * 1、调用统一下单,取得code_url,生成二维码
 * 2、用户扫描二维码,进行支付
 * 3、支付完成之后,微信服务器会通知支付成功
 * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
 */
$input = new WxPayUnifiedOrder();
$input->SetBody("1分钱购买何宁");
$input->SetAttach("1分钱购买何宁");
$num=WxPayConfig::MCHID.date("YmdHis");
$input->SetOut_trade_no($num);
$input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("123456789");
$result = $notify->GetPayUrl($input);
$url2 = $result["code_url"];
?>

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1" /> 
    <title>微信支付样例</title>
</head>
<body>
    <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描支付模式二</div><br/>
    <img alt="模式二扫码支付" src="qrcode.php?data=<?php echo urlencode($url2);?>"   style="max-width:90%"/>
    <div id="myDiv"></div><div id="timer">0</div>
    <script>  
    //设置每隔1000毫秒执行一次load() 方法  
    var myIntval=setInterval(function(){load()},1000);  
    function load(){  
       document.getElementById("timer").innerHTML=parseInt(document.getElementById("timer").innerHTML)+1; 
        var xmlhttp;    
        if (window.XMLHttpRequest){    
            // code for IE7+, Firefox, Chrome, Opera, Safari    
            xmlhttp=new XMLHttpRequest();    
        }else{    
            // code for IE6, IE5    
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    
        }    
        xmlhttp.onreadystatechange=function(){    
            if (xmlhttp.readyState==4 && xmlhttp.status==200){    
                trade_state=xmlhttp.responseText;  
                if(trade_state==&#39;SUCCESS&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;支付成功&#39;;  
                    //alert(transaction_id);  
                    //延迟3000毫秒执行tz() 方法
                    clearInterval(myIntval);  
                    setTimeout("location.href=&#39;success.php&#39;",3000);  

                }else if(trade_state==&#39;REFUND&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;转入退款&#39;; 
                    clearInterval(myIntval); 
                }else if(trade_state==&#39;NOTPAY&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;请扫码支付&#39;;  
                      
                }else if(trade_state==&#39;CLOSED&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;已关闭&#39;;  
                    clearInterval(myIntval);
                }else if(trade_state==&#39;REVOKED&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;已撤销&#39;;  
                    clearInterval(myIntval);
                }else if(trade_state==&#39;USERPAYING&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;用户支付中&#39;;  
                }else if(trade_state==&#39;PAYERROR&#39;){  
                    document.getElementById("myDiv").innerHTML=&#39;支付失败&#39;; 
                    clearInterval(myIntval); 
                }  
                 
            }    
        }    
        //orderquery.php 文件返回订单状态,通过订单状态确定支付状态  
        xmlhttp.open("POST","orderquery.php",false);    
        //下面这句话必须有    
        //把标签/值对添加到要发送的头文件。    
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");    
        xmlhttp.send("out_trade_no=<?php echo $num;?>");  
         
        }  
    </script>
    
</body>
</html>
Nach dem Login kopieren

Der orderquery.php-Code wurde ebenfalls entsprechend angepasst:

<?php
ini_set(&#39;date.timezone&#39;,&#39;Asia/Shanghai&#39;);
error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";
require_once &#39;log.php&#39;;
 
//初始化日志
$logHandler= new CLogFileHandler("./logs/".date(&#39;Y-m-d&#39;).&#39;.log&#39;);
$log = Log::Init($logHandler, 15);
 
function printf_info($data)
{
    foreach($data as $key=>$value){
        echo "<font color=&#39;#f00;&#39;>$key</font> : $value <br/>";
    }
}
 
 
if(isset($_REQUEST["transaction_id"]) && $_REQUEST["transaction_id"] != ""){
    $transaction_id = $_REQUEST["transaction_id"];
    $input = new WxPayOrderQuery();
    $input->SetTransaction_id($transaction_id);
    //printf_info(WxPayApi::orderQuery($input));
    $result=WxPayApi::orderQuery($input);
    echo $result[&#39;trade_state&#39;];
    exit();
}
 
if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
    $out_trade_no = $_REQUEST["out_trade_no"];
    $input = new WxPayOrderQuery();
    $input->SetOut_trade_no($out_trade_no);
    //printf_info(WxPayApi::orderQuery($input));
    $result=WxPayApi::orderQuery($input);
    echo $result[&#39;trade_state&#39;];
    exit();
}
?>
Nach dem Login kopieren

Neue success.php-Datei:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>微信支付成功</title>
</head>
 
<body>
<br /><br /><br /><br /><br /><br /><br />
<h1>微信支付成功</h1>
</body>
</html>
Nach dem Login kopieren

Das Obige ist der vom Autor zusammengefasste Code. Nach dem Debuggen wurde festgestellt, dass kein Problem vorliegt. Interessierte Freunde können darauf verweisen.

Das obige ist der detaillierte Inhalt vonPHP WeChat-Zahlungsentwicklungsmethode für Rückruf nach dem Scannen der Zahlung (Modus 2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!