Heim  >  Artikel  >  WeChat-Applet  >  Detaillierte Einführung in das PHP-Entwicklungsprogramm für WeChat-Zahlungsschnittstellen

Detaillierte Einführung in das PHP-Entwicklungsprogramm für WeChat-Zahlungsschnittstellen

高洛峰
高洛峰Original
2017-03-16 15:23:572435Durchsuche

Die

WeChat-Zahlungsschnittstelle wird nun langsam wie bei Alipay verfügbar. Sie können die API-Schnittstelle verwenden, um Zahlungen auf Websites oder Anwendungen von Drittanbietern zu implementieren Schnittstellenentwicklung Das Programm wurde getestet.

Erklärung zum PHP WeChat-Zahlungsschnittstellen-Entwicklungsprogramm

:

Erforderliche Bedingungen: appid // Erhalten vom Entwicklercenter des offiziellen Konto-Backends (dasselbe wie das in der E-Mail)

mchid//Erhalten in der E-Mail

Schlüssel/ /Vom Händler-Backend festgelegt

appsecret //Das offizielle Account Developer Center hat

zwei Zertifikatdateien erhalten, und apiclient_cert.pem wurde in der E-Mail apiclient_key.pem abgerufen

Hinweise :
WeChat-Zahlung im Hintergrund des öffentlichen Kontos-》Entwicklungskonfiguration-》
Testverzeichnis hinzufügen und persönliches WeChat-Konto testen. Developer Center – „Webseitenautorisierung zum Abrufen grundlegender Benutzerinformationen“ – Ändern Sie es in Ihren Testdomänennamen. Andernfalls tritt ein re
direct_uri-Parameterfehler auf——————————Nachverfolgung muss verbessert werden——————-
Die WeChat-Seite „Zahlungsbereit“ wird ausgeführt drei Vorgänge allein im Hintergrund:

1. Openid abrufen


//使用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();
  }
I Ich bin auch im ersten Schritt darauf gestoßen. Das Problem besteht darin, dass die OpenID nicht abgerufen werden kann. Die Demo verwendet Curl, um sie abzurufen.

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 c
URL-Operationen benötigt werden. Ich habe eine Stelle in der Entwicklungsdokumentation gesehen, die libcurl 7.20.1 oder höher für Zertifikatsvorgänge erfordert. Dann habe ich am Server gearbeitet, um die PHP-Curl-Version von
Linux zu verbessern. Am Ende bin ich einfach auf einen anderen Windows-Server umgestiegen. Lassen Sie uns dies vorerst tun und
debuggen, wenn Sie es das nächste Mal verwenden müssen.

Schritt 2: Erhalten und bezahlen Sie die Bestellnummer-IDDer 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 Es stoßen auch so 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. Drucken Sie einige Dateien im
xml-Format und zeigen Sie nur die Zeichenlänge, nicht den Inhalt an. 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 ich es wahllos versuchen sollte. Für diesen Debugschritt können Sie den Fehlercode mit var_dump($this->result); in getPrepayId() anzeigen.

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 dabei auf ein weiteres Problem gestoßen Teil:


androidgibt „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————

wxpay1wxpay3
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>
Senden Die Rückgabe ist 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>
Es steht mir frei, die darin enthaltenen Daten zu verwenden. Bitte beachten Sie das untenstehende Format. Beachten Sie außerdem, dass zwischen Groß- und Kleinschreibung unterschieden wird.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in das PHP-Entwicklungsprogramm für WeChat-Zahlungsschnittstellen. 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