Heim >Backend-Entwicklung >PHP-Tutorial >So schreiben Sie ein WeChat-Programm zur Entwicklung der Zahlungsschnittstelle in PHP

So schreiben Sie ein WeChat-Programm zur Entwicklung der Zahlungsschnittstelle in PHP

墨辰丷
墨辰丷Original
2018-06-01 16:00:565474Durchsuche

Die WeChat-Zahlungsschnittstelle ähnelt jetzt langsam Alipay, das die API-Schnittstelle verwenden kann, um Websites oder Anwendungen von Drittanbietern für die Zahlung zu implementieren. Das Folgende ist ein PHP-WeChat-Zahlungsschnittstellen-Entwicklungsprogramm und wurde von interessierten Freunden getestet siehe

Erläuterung zum PHP-WeChat-Zahlungsschnittstellen-Entwicklungsprogramm:

Erforderliche Bedingungen:
appid //vom offiziellen Konto-Backend-Entwickler erhalten center (Dasselbe wie das in der E-Mail)

mchid//In der E-Mail erhalten

key//Vom Händler-Backend eingerichtet

appsecret //In der erhalten offizielles Kontoentwicklerzentrum
Zwei Zertifikatsdateien, apiclient_cert.pem in der E-Mail erhalten apiclient_key.pem
Hinweise:
Offizieller Kontohintergrund WeChat-Zahlung – „Entwicklungskonfiguration –“ Testverzeichnis hinzufügen und Testen Sie die persönliche WeChat-ID.
Developer Center – „Webseitenautorisierung zum Abrufen grundlegender Benutzerinformationen“ – Ändern Sie es in Ihren Testdomänennamen. Andernfalls tritt ein Fehler beim Parameter „redirect_uri“ auf.
——————————Follow-up muss verbessert werden——————-
Die WeChat-Zahlungsbereitschaftsseite führte drei Vorgänge selbstständig aus Hintergrund:

1. Holen Sie sich openid

//使用jsapi接口
 
 代码如下复制代码
  $jsApi = new JsApi_pub();
 
  //=========步骤1:网页授权获取用户openid============
  //通过code获得openid
  if (!isset($_GET['code']))
  {
    //触发微信返回code码
    $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
    //echo $url;
    Header("Location: $url");
  }else
  {
    //获取code码,以获取openid
    $code = $_GET['code'];
    $jsApi->setCode($code);
    $openid = $jsApi->getOpenid();
  }

Am Anfang bin ich auch darauf gestoßen Probleme im ersten Schritt, openid konnte nicht abgerufen werden. Bei einigen Servern verwendet die Demo die Curl-Erfassungsmethode.
Es ist seltsam, dass mein Server-Curl nicht abgerufen werden konnte. Später wurde es in file_get_contents geändert und kann normal abgerufen werden.
Aber das ist nicht die Lösung. Weil später weitere Curl-Operationen benötigt werden.
Ich habe in der Entwicklungsdokumentation eine Stelle gesehen, die libcurl 7.20.1 oder höher für Zertifikatsvorgänge erfordert. Dann habe ich am Server gearbeitet, um die Version von PHP Curl für Linux zu verbessern. Am Ende bin ich einfach auf einen anderen Windows-Server umgestiegen.
Machen wir das zunächst einmal und debuggen es das nächste Mal, wenn wir es verwenden müssen.

Schritt 2: Bestellnummer-ID abrufen und bezahlen
Der Code lautet wie folgt

$unifiedOrder = new UnifiedOrder_pub();
   
  //var_dump($unifiedOrder);
  //设置统一支付接口参数
  //设置必填参数
  //appid已填,商户无需重复填写
  //mch_id已填,商户无需重复填写
  //noncestr已填,商户无需重复填写
  //spbill_create_ip已填,商户无需重复填写
  //sign已填,商户无需重复填写
  $unifiedOrder->setParameter("openid","$openid");//商品描述
  $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
  //自定义订单号,此处仅作举例
  $timeStamp = time();
  $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
  $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
  $unifiedOrder->setParameter("total_fee","1");//总金额
  $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 
  $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
  //非必填参数,商户可根据实际情况选填
  //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 
  //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
  //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
  //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
  //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
  //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
 
 
  $prepay_id = $unifiedOrder->getPrepayId();
   
  //echo 'prepay_id:';
  var_dump($prepay_id);

Dieser Schritt passiert auch. Habe viele Fragen.
Erstens ist es schwierig, die WeChat-Zahlung zu testen, und sie kann nur innerhalb von WeChat getestet werden. Ich benutze einfach mein Handy, um herumzuwischen.
Zweitens ist es nicht einfach, var_dump zum Debuggen zu verwenden. Beim Drucken einiger Dateien im XML-Format wird nur die Zeichenlänge angezeigt, nicht der Inhalt. Also habe ich es in Form eines Protokolls zum Debuggen auf dem Server geschrieben:
Der Code lautet wie folgt

// 打印log
  function log_d($word) 
  {
    $log_name="./logd.log";//log文件路径
    $fp = fopen($log_name,"a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."n".$word."nn");
    flock($fp, LOCK_UN);
    fclose($fp);
  }

Verwenden Sie $this-. in WxPayPubHelper.php in der Demo >log_d(xxx); aufgerufen.
Am Anfang bekam ich immer wieder Fehlermeldungen, weil die mir gegebenen mchid und appid nicht übereinstimmten. . Sie haben mir die falsche Kontonummer gegeben. Am Anfang wusste ich nicht, wie man es wahllos versucht. Für diesen Debugschritt können Sie den Fehlercode in var_dump($this->result); in getPrepayId() sehen.

Schritt 3: Generieren Sie den Zahlungs-Frontend-JS-Code und fügen Sie ihn auf der Webseite ein:
Der Code lautet wie folgt

$jsApi->setPrepayId($prepay_id);
 
$jsApiParameters = $jsApi->getParameters();

——————-Zum Bezahlen klicken————————-

Ich bin auf ein weiteres Problem gestoßen dieser Teil:
Android gibt „System: Access_denied“ zurück, ios gibt „access_control:not_allowed“ zurück
Ich habe viel auf Baidu gesucht. Tatsächlich habe ich dieses Ding schon lange gesehen und es nie bemerkt!
Die Seite, die die Autorisierungsanforderung initiiert, muss eine Seite im Autorisierungsverzeichnis sein und darf nicht in einem Unterverzeichnis vorhanden sein. Andernfalls wird ein Fehler zurückgegeben.
Ich habe die Zahlungsdatei in /domain name/pay/demo/ abgelegt.
Am Anfang bin ich immer bis zum Ende von /domain name/pay/ gegangen und dachte, das sei genug. Unterverzeichnisse unterstützen, das Ergebnis ist nicht möglich! .
————————Schauen Sie sich zum Schluss das Bild unten an————

wxpay1
wxpay3
wxpay2

—— ————xmljs im Prozess——————–
Generierungs- und Zahlungsauftrags-ID, die übermittelt werden muss:
Der Code lautet wie folgt

<xml>
 <openid><![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]></openid>
 <body><![CDATA[贡献一下]]></body>
 <out_trade_no><![CDATA[wx88888888888888881414411779]]></out_trade_no>
 <total_fee>1</total_fee>
 <notify_url><![CDATA[http://shanmao.me/wxpay/notify_url.php]]></notify_url>
 <trade_type><![CDATA[JSAPI]]></trade_type>
 <appid><![CDATA[wx8888888888888888]]></appid>
 <mch_id>10012345</mch_id>
 <spbill_create_ip><![CDATA[61.50.221.43]]></spbill_create_ip>
 <nonce_str><![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]></nonce_str>
 <sign><![CDATA[2D8A96553672D56BB2908CE4B0A23D0F]]></sign>
</xml>

Nach der Übermittlung ist die Rückgabe korrekt und enthält perpay_id:

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code> 
 <return_msg><![CDATA[OK]]></return_msg> 
 <appid><![CDATA[wx8888888888888888]]></appid> 
 <mch_id><![CDATA[10012345]]></mch_id> 
 <nonce_str><![CDATA[Be8YX7gjCdtCT7cr]]></nonce_str> 
 <sign><![CDATA[885B6D84635AE6C020EF753A00C8EEDB]]></sign> 
 <result_code><![CDATA[SUCCESS]]></result_code> 
 <prepay_id><![CDATA[wx201410272009395522657a690389285100]]></prepay_id> 
 <trade_type><![CDATA[JSAPI]]></trade_type> 
</xml>

JS zum Generieren der Zahlung:

{
  "appId": "wx8888888888888888",
  "timeStamp": "1414411784",
  "nonceStr": "gbwr71b5no6q6ne18c8up1u7l7he2y75",
  "package": "prepay_id=wx201410272009395522657a690389285100",
  "signType": "MD5",
  "paySign": "9C6747193720F851EB876299D59F6C7D"
}

Nach erfolgreicher Zahlung zurückgegebene Benachrichtigungs-XML:

<xml><appid><![CDATA[wx8888888888]]></appid>
<bank_type><![CDATA[CCB_DEBIT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[1011111]]></mch_id>
<nonce_str><![CDATA[38gt0ffgsvfsdfsdfbt1981duv63p7]]></nonce_str>
<openid><![CDATA[o4p3SjfdsfdsfdsdCE5Y2XHw4]]></openid>
<out_trade_no><![CDATA[wx4b56d1fsdfdsf416643247]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[356EfsdfdsfsdsfE69509EDA344]]></sign>
<sub_mch_id><![CDATA[10018826]]></sub_mch_id>
<time_end><![CDATA[20141122160122]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[100715001020fsdfsd1220006123174]]></transaction_id>
</xml>

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, Ich hoffe, dass es für alle hilfreich sein kann. Lernen hilft.

Verwandte Empfehlungen:

phpEine einfache Möglichkeit, das Alter zu berechnen

php Individuelle Zeitumrechnungsfunktion

phpSchnittstellentechnik-Beispiele und ausführliche Erklärungen mit Bildern und Texten

Das obige ist der detaillierte Inhalt vonSo schreiben Sie ein WeChat-Programm zur Entwicklung der Zahlungsschnittstelle in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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