PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

小云云
Freigeben: 2023-03-21 06:46:02
Original
6495 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich den Entwicklungsprozess der PHP-WeChat-Zahlung im Detail vor. Interessierte Freunde können darauf verweisen.

1. Entwicklungsumgebung
Thinkphp 3.2.3
WeChat: Dienstkonto, zertifiziert
Entwicklungsdomänenname: http://test.paywechat.com (seit Auf den definierten Domänennamen kann nicht über das externe Netzwerk zugegriffen werden)

2. Relevante Dokumente und Berechtigungen sind erforderlich
WeChat-Zahlung muss aktiviert werden
Entwicklerdokumentation für die öffentliche WeChat-Plattform: http:// mp.weixin.qq.com/wiki/home/index.html
WeChat Payment Developer Documentation: https://pay.weixin.qq.com/wiki/doc/api/index.html
WeChat Payment SDK-Downloadadresse: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

Entwicklung
Laden Sie die WeChat Payment PHP-Version des SDK herunter. Das Dateiverzeichnis ist wie folgt:

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Legen Sie die Cert- und Lib-Verzeichnisse ab Das Verzeichnis des WeChat-Zahlungs-SDK Thinkphp lautet

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Nun stellen wir das Problem mit dem WeChat-Zahlungsautorisierungsverzeichnis vor. Das erste besteht darin, die Zahlungsautorisierung auszufüllen Verzeichnis in der WeChat-Zahlungsentwicklungskonfiguration,

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Füllen Sie dann die Sicherheitsdomäne der js-Schnittstelle aus.

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Stellen Sie abschließend die Web-Autorisierung ein

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Nachdem diese Einstellungen abgeschlossen sind, ist es im Grunde schon zur Hälfte erledigt.

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

4. WeChat-Zahlungskonfiguration

PHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung

Füllen Sie die entsprechende Konfiguration korrekt aus .




[php] Ansicht schlichtKopie


  1. /**

  2. * Kontoinformationen konfigurieren

  3. */

  4. Klasse WxPayConfig

  5. {

  6. //========[Grundlegende Informationseinstellungen]=================== = =================

  7. //

  8. /**

  9. * TODO: Ändern Sie die Konfiguration hier, um Ihre eigenen Händlerinformationen zu beantragen

  10. * Öffentliche WeChat-Kontoinformationen Konfiguration

  11. *

  12. * APPID : An die Zahlung gebundene APPID (muss konfiguriert werden, kann in der Kontoeröffnungs-E-Mail eingesehen werden)

  13. *

  14. * MCHID: Händler-ID (muss konfiguriert werden, kann in der Kontoeröffnungs-E-Mail eingesehen werden)

  15. * )

  16. * Adresse einstellen: https://pay.weixin .qq.com/index.php/account/api_cert

  17. *

  18. * APPSECRET: Öffentliches Kontogeheimnis (nur für JSAPI-Zahlung erforderlich, melden Sie sich bei der öffentlichen Plattform an und betreten Sie das Entwicklercenter, um es festzulegen),

  19. * Adresse erhalten: https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN

  20. * @var string

  21. */

  22. const APPID = '' ; >;

  23. const KEY = '' ;

  24. const APPSECRET = ''; ===【Zertifikatpfadeinstellungen】=====================================

  25. /**

    * TODO: Händlerzertifikatpfad festlegen
  26. * Zertifikatpfad, bitte beachten Sie, dass der absolute Pfad ausgefüllt werden sollte ( Nur für Rückerstattungen und Stornierungen von Bestellungen erforderlich. Sie können sich anmelden, um die Händlerplattform herunterzuladen,

  27. * Download-Adresse des API-Zertifikats: https://pay.weixin.qq.com/index.php/account/api_cert, Sie müssen vorher das Händlerbetriebszertifikat installieren Herunterladen)

  28. * @var path

  29. */

  30. const SSLCERT_PATH = './cert/apiclient_cert.pem''../cert/apiclient_key.pem'; 🎜>//========[Curl-Proxy-Einstellungen]======================= ========= ===

  31. /**

  32. * TODO: Stellen Sie die Proxy-Maschine hier nur ein, wenn Sie keinen Proxy benötigen , bitte setzen Sie es auf 0.0.0.0 und 0

  33. * Diese Routine verwendet die HTTP-POST-Methode über Curl Der Proxyserver kann sein hier geändert,

  34. * Standardmäßig CURL_PROXY_HOST=0.0.0.0 und CURL_PROXY_PORT=0, der Proxy ist derzeit nicht aktiviert (einstellen). ggf.)

  35. * @var unlimited_type

  36. */

  37. const CURL_PROXY_HOST = "0.0.0.0";// "10.152.18.220";

  38. const CURL_PROXY_PORT = 0; //8080;

  39. //========【Konfiguration der Berichtsinformationen】============================= ==== ====

  40. /**

  41. * TODO: Berichtsebene für Schnittstellenaufrufe, standardmäßige Fehlerberichterstattung (Hinweis: Berichtszeitüberschreitung beträgt [1s], Berichterstattung unabhängig vom Erfolg oder Fehler [Niemals eine Ausnahme auslösen],

  42. * hat keinen Einfluss auf den Schnittstellenaufrufprozess), nachdem die Berichterstellung aktiviert wurde Praktisch für WeChat-Überwachungsanfrageanrufe. Aus Qualitätsgründen wird empfohlen, mindestens

  43. * die Fehlerberichterstattung einzuschalten.

  44. * Meldeebene, 0. Schließen Sie die Meldung; 1. Es werden nur Fehler gemeldet.

  45. * @var int

  46. */

  47. const REPORT_LEVENL = 1;

  48. }

Beginnen Sie jetzt mit der Veröffentlichung des Codes:




[php]Ansicht plain copy


  1. Namespace WechatController;

  2. verwendenThinkController; >/**

  3. * Der Controller der übergeordneten Klasse muss erben

  4. * @file ParentController.class.php

  5. * @author Gary 🎜>

  6. * @date 4. August 2015

  7. * @todu

  8. */

  9. Klasse ParentController erweitert Controller { 

  10. protected $options = array (

  11. 'token' => '', // Geben Sie den von Ihnen festgelegten Schlüssel ein

  12. 'encodingaeskey' => '', // Geben Sie den EncodingAESKey für die Verschlüsselung ein

  13. 'appid' => '', // Füllen in advanced Die App-ID der aufrufenden Funktion

  14. 'appsecret' => ; '', // Geben Sie den Schlüssel für die erweiterte Anruffunktion ein

  15.  'debug' => falsch,  

  16.  'logcallback' => ''  

  17.  );   

  18.  public $errCode = 40001;   

  19.  public $errMsg = „Kein Zugriff“;   

  20.   

  21.  /** 

  22.  * 获取access_token 

  23.  * @return mixed|boolean|unknown 

  24.  */   

  25.  öffentliche Funktion getToken(){  

  26.  $cache_token = S('exp_wechat_pay_token');  

  27.  if(!leer( $cache_token)){  

  28.  return $cache_token;  

  29.  }  

  30.  $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';  

  31.  $url = sprintf($url, $this->options['appid'],$this ->options['appsecret']);   

  32.  $result = $this->http_get($ URL);  

  33.  $result = json_decode($result, WAHR);   

  34.  if(leer($result)){  

  35.  return false;  

  36.  }   

  37.  S('exp_wechat_pay_token',$result['access_token'],Array ('type'=>'file','expire' =>3600));  

  38.  return $result['access_token'];  

  39.  }  

  40.   

  41.  /**

  42. * Kundendienstnachricht senden

  43. * @param array $data Nachrichtenstruktur {"touser": "OPENID", "msgtype": "news", "news":{...}🎜>

  44. */  

  45.  öffentlich  Funktion sendCustomMessage($data){  

  46.  $token = $this->getToken();  

  47.  if (leer($token)) return false;   

  48.  $url = 'https://api.weixin.qq.com/cgi-bin/message/custom /send?access_token=%s';  

  49.  $url = sprintf($url, $token);  

  50.  $result = $this-> http_post($url,self::json_encode($data));  

  51.  if ($result)  

  52.  {  

  53.  $json = json_decode ($result,true);  

  54.  if (!$json || !empty($json['errcode'])) {  

  55.  $this->errCode = $json['errcode' ];  

  56.  $this->errMsg = $json['errmsg'];  

  57.  return false;  

  58.  }  

  59.  zurück $json;  

  60.  }  

  61.  zurück FALSCH;  

  62.  }  

  63.   

  64.  /**

  65. * Vorlagenachricht senden

  66. * @param unlimited $data

  67. * @return boolean|unknown

  68. */  

  69. öffentlich Funktion sendTemplateMessage($data){  

  70.  $token = $this->getToken();  

  71.  if (leer($token)) return false;  

  72.  $url = "https://api.weixin.qq. com/cgi-bin/message/template/send?access_token=%s";  

  73.  $url = sprintf($url,$token);  

  74.  $result = $this->http_post($url,self::json_encode($data));  

  75.  if ($result)  

  76.  {  

  77.  $json = json_decode($result,true);  

  78.  if (!$json || !empty($json['errcode'])) {  

  79.  $this->errCode = $json['errcode' ];  

  80.  $this->errMsg = $json['errmsg'];  

  81.  return false;  

  82.  }  

  83.  zurück $json;  

  84.  }  

  85.  zurück FALSCH;  

  86.  }  

  87.   

  88.   

  89.  public function getFileCache($name){  

  90.  return S($name);  

  91.  }  

  92.   

  93.  /**

  94. * Die WeChat-API unterstützt keine chinesische Escape-JSON-Struktur

  95. * @param array $arr

  96. */  

  97.  statisch  Funktion json_encode($arr) {  

  98.  $parts = array ();  

  99.  $is_list = false;  

  100.  //Finden Sie heraus, ob das gegebene Array ein numerisches Array ist  

  101.  $keys = array_keys ( $arr );  

  102.  $max_length = count (  $arr ) - 1;  

  103.  if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //Überprüfen Sie, ob der erste Schlüssel 0 ist und der letzte Schlüssel die Länge 1 hat.   

  104.  $is_list = true;  

  105.  für($i = 0; $i count ( $keys );  $i ++) { //Überprüfen, ob jede Taste ihrer Position entspricht  

  106.   if ($i != $keys [$i ]) { //Eine Taste schlägt bei der Positionsprüfung fehl.  

  107.   $is_list = false; //Es ist ein assoziatives Array.  

  108.   Pause;  

  109.  }  

  110.  }  

  111.  }  

  112.  foreach ( $arr as $key =>  $value ) {  

  113.  if (is_array ( $value )) { //Benutzerdefinierte Behandlung für Arrays  

  114.  if ($is_list)  

  115.   $parts [] = self::json_encode ( $value ); /* :RECURSION: */  

  116.  else

  117.   $parts [] = '"' . $key  . '":' . self::json_encode ( $value ); /* :RECURSION: */  

  118.  } else {  

  119.  $str = '';  

  120.  if (! $is_list)  

  121.   $str = '"' .  $key .  '":';  

  122.  //Benutzerdefinierte Behandlung für mehrere Datentypen  

  123.  if (!is_string ( $value ) && is_numeric ( $value ) && $value

  124.   $str .= $value//Zahlen  

  125.  elseif ( $value === false)  

  126.  $str .= 'false'//Die booleschen Werte  

  127.  elseif ($value === true)  

  128.  $str . = 'wahr';  

  129.  else  

  130.   $str .= '"' . fügt Schrägstriche hinzu ( $value ) .  '"'//Alle anderen Dinge  

  131.  // :TODO: Gibt es noch mehr Datentyp, nach dem wir Ausschau halten sollten? (Objekt?)  

  132.  $parts [] = $str;  

  133.  }  

  134.  }  

  135.  $json = implode ( ','$parts  );  

  136.  if ($is_list)  

  137. return '[' .$json . ']' > zurück'{'

    .
  138. $json

    } > +--------------------------------- ------- ---------------------

  139. * Zufällige Zeichenfolge generieren

  140. +----------------- --------- ----------------
  141. * @param int $length Die Länge der zu generierenden Zufallszeichenfolge
  142. * @param string $type Zufälliger Codetyp: 0, Zahlen + Groß- und Kleinbuchstaben; 2, Kleinbuchstaben 3, Großbuchstaben -1, Zahlen + Groß- und Kleinbuchstaben + Sonderzeichen; >
  143.  +---------------------------------- ------------------------ 

  144.  * @ Rückgabezeichenfolge 

  145.  +----------------------- ----------------------------------- 

  146.  */  

  147.  statisch public function randCode($length = 5, $ Typ = 2){  

  148.  $arr =  array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 = >  "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 =>  "~@#$%^&*(){}[]|");  

  149.  if ($type == 0) {  

  150.  array_pop($arr);  

  151.  $string = implode("", $arr);  

  152.  } elseif ($type == "-1") {  

  153.  $string = implode(""$arr);  

  154.  } else {  

  155.  $string = $arr[$type];  

  156.  }  

  157.  $count = strlen($string) - 1;  

  158.  $code = '';  

  159.  für ($i = 0; $i $length$i++) {  

  160.  $code .= $string[rand(0 , $count)];  

  161.  }  

  162.  zurück $code;  

  163.  }   

  164.   

  165.   

  166.  /** 

  167.  * GET 请求 

  168.  * @param string $url 

  169.  */  

  170.  privat Funktion http_get($url){  

  171.  $oCurl = curl_init();  

  172.  if(stripos($url,"https://")!==FALSE){  

  173.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);  

  174.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);  

  175.  curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1  

  176.  }  

  177.  curl_setopt($oCurl, CURLOPT_URL, $url);  

  178.  curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );  

  179.  $sContent = curl_exec($oCurl) ;  

  180.  $aStatus = curl_getinfo($oCurl) ;  

  181.  curl_close($oCurl);  

  182.  if(intval($aStatus["http_code"])==200){  

  183.  return $sContent;  

  184.  }else{  

  185.  return false;  

  186.  }  

  187.  }  

  188.  /**

  189. * POST-Anfrage

  190. * @param string $url

  191. * @param array $param

  192. * @param boolean $post_file Ob Dateien hochgeladen werden sollen

  193. * @return string content

  194. */  

  195.  privat Funktion http_post($url,$param,$post_file=false){  

  196. $oCurl = curl_init();  

  197.  if(stripos($url,"https://")!==FALSE){  

  198.  curl_setopt( $oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);  

  199.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);  

  200.  curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1  

  201.  }  

  202.  if (is_string($param) ||  $post_file) {  

  203.  $strPOST = $param;  

  204.  } sonst {  

  205.  $aPOST = array();  

  206.  foreach($param as $key=>$val){  

  207.  $aPOST[] = $key."= ".urlencode($val);  

  208.  }  

  209.  $strPOST = join("&"$aPOST);  

  210.  }  

  211.  curl_setopt($oCurl , CURLOPT_URL, $url);  

  212.  curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );  

  213.  curl_setopt($oCurl, CURLOPT_POST,true);  

  214.  curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);  

  215.  $sContent = curl_exec($oCurl) ;  

  216.  $aStatus = curl_getinfo($oCurl) ;  

  217.  curl_close($oCurl);  

  218.  if(intval($aStatus["http_code"])==200){  

  219.  return $sContent;  

  220.  }else{  

  221.  return false;  

  222.  }  

  223.  }  

  224. }  




[php] ansehen plain copy


  1. Namespace WechatController;  

  2. verwenden WechatControllerParentController;  

  3. /**

  4. * WeChat-Zahlungstestcontroller

  5. * @file TestController.class.php

  6. * @author Gary

  7. * @date 4. August 2015

  8. * @todu

  9. */  

  10. Klasse TestController erweitert ParentController {  

  11.  privat $_order_body = 'xxx';  

  12.  privat $_order_goods_tag = 'xxx';  

  13.  öffentlich Funktion __construct(){  

  14.  parent::__construct();  

  15.  require_once ROOT_PATH."Api/lib/WxPay.Api.php" ;  

  16.  require_once ROOT_PATH."Api/lib/WxPay.JsApiPay.php" ;  

  17.  }  

  18.   

  19. public function index(){

  20. ///①, Benutzer-OpenID abrufen

  21. $tools = neu JsApiPay();

  22. $openId = $tools->GetOpenid(); > //②, Einheitliche Reihenfolge

  23. $input

    =
  24. new

    WxPayUnifiedOrder(); > $input

    ->SetBody(
  25. $this

    - >_order_body);

  26. //Zusätzliche Daten, Sie können die benötigten Daten hinzufügen, WeChat gibt den asynchronen Rückruf zurück. Hängen Sie dies an Daten

  27. $input->SetAttach('xxx');

  28. //Händlerbestellnummer

  29. $out_trade_no = WxPayConfig::MCHID.Datum("YmdHis"); 🎜>

  30. $input->SetOut_trade_no($out_trade_no ; 🎜>

  31. $input->SetTotal_fee(1);

  32. //Transaktionsstartzeit

  33. $ Eingabe->SetTime_start(Datum(

  34. "YmdHis"
  35. )); //Endzeit der Transaktion

  36. $input->SetTime_expire(date("YmdHis ", time() + 600));

  37. //Produkt-Tag

  38. $input->SetGoods_tag($this->_order_goods_tag);

  39. //Benachrichtigungsadresse, Rückrufadresse für asynchrone WeChat-Zahlung erhalten SITE_URL=http://test .paywechat.com/Charge

  40. $notify_url = SITE_URL. '/index.php/Test/notify.html'->SetNotify_url($notify_url

  41. );
  42. / /Handelstyp

  43. $input->SetTrade_type("JSAPI"

    );
  44. $openId

    ) ;

  45. $order = WxPayApi::unifiedOrder($input);

  46. $jsApiParameters = $tools->GetJsApiParameters( $order);

  47. //Erhalten Sie die js-Funktionsparameter für die gemeinsame Lieferadresse

  48. $editAddress = $tools ->GetEditAddressParameters();

  49. this

    ->assign(
  50. 'openId'

    ,$openId); $this

    ->assign(
  51. 'jsApiParameters'

    , $jsApiParameters); 'editAddress' ,$editAddress);

  52. $this->display(); > } 

  53.  /**

  54. * Asynchrone Benachrichtigungsrückrufmethode

  55. */

  56. öffentlich

  57. Funktion

    notify (){ require_once

    ROOT_PATH.
  58. "Api/lib/notify.php "

    ; > PayNotifyCallBack();

  59. $notify- >Handle(false); >

  60. //Der IsSuccess hier ist eine von mir angepasste Methode. Ich werde den Code dieser Datei später als Referenz veröffentlichen .
  61. $is_success
  62. = $notify ->IsSuccess();

  63.  $bdata = $is_success['data'];   

  64.  //支付成功  

  65.  if($is_success['code'] == 1 ){   

  66.  $news = array(  

  67.   'touser' =>  $bdata[ 'openid'],  

  68.   'msgtype' =>  'news',  

  69.   'news' =>  Array (  

  70. 'articles'=> array (

  71. array(

  72. 'title' => 'Bestellung erfolgreich bezahlt', >'Beschreibung' => {$bdata['total_fee']}n"

  73. .
  74. "WeChat-Bestellnummer: {$bdata['transaction_id']}n"

  75. 'picurl'

    => '',

  76. 'url' =>''

  77. )

  78. )
  79. )
  80. ) ;
  81. //WeChat-Zahlungsbenachrichtigung senden

  82. $this->sendCustomMessage($news); > }else

    {
  83. / /Zahlung fehlgeschlagen

  84. /**

  85. * Zahlungserfolgsseite

  86. * Unzuverlässige Rückrufe

  87. */

  88. öffentlich
  89. Funktion ajax_PaySuccess(){

  90. //Bestellnummer

  91. $out_trade_no
  92. = I('post.out_trade_no');

  93. //Zahlungsbetrag total_fee = I(

  94. 'post.total_fee'
  95. ); /*Verwandte Logikverarbeitung*/

  96. HTML-Vorlage einfügen


[xhtml]

Ansicht schlicht
Kopie



html

    >
  1.  Kopf

  2. >
  3.  

  4.  meta http-equiv="content-type" content="text/html;charset=utf-8" />  

  5.  meta name="viewport" content="width= device-width, initial-scale=1"/>   

  6.  < ;title>微信支付样例-支付title >  

  7. Skript Typ= „Text/Javascript“>

  8. //WeChat JS API-Zahlung aufrufen

  9. Funktion jsApiCall()

  10. {

  11. WeixinJSBridge.invoke(

  12. 'getBrandWCPayRequest',

  13. {$jsApiParameters},

  14. function(res){

  15. WeixinJSBridge.log( res.err_msg);

  16. //Zahlung abbrechen

  17. if( res.err_msg == 'get_brand_wcpay_request:cancel'){

  18. //Ereignislogik zur Verarbeitung der Zahlungsstornierung

  19. }else if(res.err_msg == "get_brand_wcpay_request: ok"){

  20. /*Verwenden Sie die obige Methode, um die Front-End-Rendite zu ermitteln. Das WeChat-Team erinnert feierlich daran:

  21. res .err_msg wird verwendet, wenn der Benutzer nach Erfolg eine Rückgabe in Ordnung macht, aber es garantiert nicht, dass es absolut zuverlässig ist

  22. Hier können Sie Ajax zum Senden verwenden den Hintergrund und verarbeiten Sie einige Protokolle, z. B. ajax_PaySuccess in der Test-Controller-Methode. err_code+res.err_desc+res.err_msg); 🎜>

  23. );
  24.  }  

  25.   

  26.  Funktion callpay()  

  27.  {  

  28.  if (typeof WeixinJSBridge  == "undefiniert"){  

  29.  if( document.addEventListener ){  

  30.  document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);  

  31.  }else if (document.attachEvent){  

  32.  document.attachEvent(' WeixinJSBridgeReady', jsApiCall);   

  33.  document.attachEvent('onWeixinJSBridgeReady', jsApiCall);  

  34.  }  

  35.  }else{  

  36.  jsApiCall();  

  37.  }  

  38.  }  

  39.  //获取共享地址  

  40.  function editAddress()  

  41.  {  

  42.  WeixinJSBridge.invoke(  

  43.  'editAddress',  

  44.  {$editAddress},  

  45.  function(res){  

  46.  var value1 = res.proviceFirstStageName;  

  47.  var value2 = res.addressCitySecondStageName;  

  48.  var value3 = res.addressCountiesThirdStageName;  

  49.  var value4 = res.addressDetailInfo;  

  50.  var tel = res.telNumber;   

  51.  alert(value1 + value2 + value3 + value4 + ":" + tel);  

  52.  }  

  53.  );  

  54.  }  

  55.   

  56.  window.onload = function(){  

  57.  if (typeof WeixinJSBridge == "undefiniert"){  

  58.  if( document. addEventListener ){  

  59.  document.addEventListener('WeixinJSBridgeReady', editAddress, false);  

  60.  }else if (document.attachEvent){  

  61.  document.attachEvent(' WeixinJSBridgeReady', editAddress);   

  62.  document.attachEvent('onWeixinJSBridgeReady', editAddress);  

  63.  }  

  64.  }else{  

  65.  editAddress();  

  66.  }  

  67.  };  

  68.   

  69.  Skript>  

  70. Kopf >  

  71. Körper >  

  72.  br/>   

  73. Schriftart Farbe= „#9ACD32“>b>Der Zahlungsbetrag für diese Bestellung beträgt span style="color:#f00;font-size:50px " >1 PunktSpanne>Geld b>Schriftart>br/>br/>

  74.  p align= „Mitte“>  

  75.  Schaltfläche  Stil="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border: 0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" ="button" onclick="callpay()" >立即支付Schaltfläche>  

  76.  

    p>  

  77. Körper>

  78. html>

notify.php-Dateicode, hier ist eine neu hinzugefügte benutzerdefinierte Methode in der offiziellen Datei.




[php] Ansicht einfachkopieren


  1. require_onceROOT_PATH."Api/lib/WxPay.Api.php"; >require_once

    ROOT_PATH.
  2. ' Api/lib/WxPay.Notify.php'

    ; require_once

    ROOT_PATH.
  3. 'Api/lib/log.php'

    ;

  4.   

  5. //初始化日志  

  6. $logHandlerneu CLogFileHandler(ROOT_PATH." /logs/".Datum('Y-m-d'). '.log');  

  7. $log = Log::Init($logHandler, 15);  

  8.   

  9. Klasse PayNotifyCallBack verlängert WxPayNotify  

  10. {  

  11.  geschützt $para = Array ('code'=>0,'data'=>'' );  

  12.  //查询订单  

  13.  public function Queryorder($transaction_id)  

  14.  {  

  15.  $input =  neu WxPayOrderQuery();  

  16.  $input->SetTransaction_id($transaction_id);  

  17.  $result = WxPayApi::orderQuery($input);  

  18.  Log::DEBUG("query:" . json_encode($result));  

  19.  if(array_key_exists("return_code"$result)  

  20.  && array_key_exists("result_code"$result)  

  21.  && $result["return_code"] == " ERFOLGREICH"  

  22.  && $result["result_code "] == "ERFOLG")  

  23.  {  

  24.  return true;  

  25.  }  

  26. $this->para['code'] = 0;

  27. $this->para['data'] = '';

  28. return false

  29.  

  30. // Schreiben Sie die Callback-Handler-Funktion neu

  31. public Funktion NotifyProcess($data, &$msg)

  32. {

  33. Log::DEBUG(

    "call zurück: „ .json_encode($data));

  34. $notfiyOutput = array();

  35. if(!array_key_exists("transaction_id", $data)){

  36. $msg = "Die Eingabeparameter sind falsch"; >

  37. $this

    ->para['code'] = 0; >

  38. $this
  39. ->para['data' ] = '';

  40. return
  41. false;

    }  
  42. //Fragen Sie die Reihenfolge ab, um sie zu bestimmen wenn die Bestellung authentischer Sex ist
  43. if(!$this->Queryorder($ Daten["transaction_id"])){

  44. $msg = "Bestellabfrage fehlgeschlagen";

  45. $this->para['code'] = 0;

  46. $this->para['data'] = '';

  47. return false; > }

  48. $this
  49. ->para[

    'code'] = 1;

  50. $this->para['data'] = $data; 🎜>

  51.  

  52. /**

  53. * Benutzerdefinierte Methode zur Erkennung, ob der Rückruf auf WeChat erfolgreich ist
  54. * @return multitype:number string
  55. */
  56. öffentlich

    Funktion IsSuccess(){

  57. return $this->para;

    }
  58. Dies ist im Grunde genommen abgeschlossen, Sie können http://test.paywechat auf WeChat com/Charge/index.php/Test/index/Related öffnen Empfehlungen:

  59. Detaillierte Erläuterung der NodeJS-Implementierung des WeChat-Zahlungsfunktionsbeispiels

    Thinkphp integriert die WeChat-Zahlungsfunktion

    So fügen Sie diese WeChat-Zahlungsfunktion zur PC-Website hinzu

Das obige ist der detaillierte Inhalt vonPHP implementiert die Codefreigabe für die WeChat-Zahlungsfunktionsentwicklung. 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!