PHP implémente le partage de code de développement de la fonction de paiement WeChat

小云云
Libérer: 2023-03-21 06:46:02
original
6527 Les gens l'ont consulté

Cet article présente principalement en détail le processus de développement du paiement PHP WeChat. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer. J'espère qu'il pourra aider tout le monde.

1. Environnement de développement
Thinkphp 3.2.3
WeChat : Compte de service, certifié
Nom de domaine de développement : http://test.paywechat.com (depuis Le nom de domaine défini n'est pas accessible depuis le réseau externe)

2. Les documents et autorisations pertinents sont requis
Le paiement WeChat doit être activé
Documentation du développeur de la plateforme publique WeChat : http:// mp.weixin.qq.com/wiki/home/index.html
Documentation du développeur de paiement WeChat : https://pay.weixin.qq.com/wiki/doc/api/index.html
Adresse de téléchargement du SDK de paiement WeChat : https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

3. Téléchargez WeChat Pour payer la version PHP du SDK, le répertoire de fichiers est comme indiqué ci-dessous :

PHP implémente le partage de code de développement de la fonction de paiement WeChat

PHP implémente le partage de code de développement de la fonction de paiement WeChat
Mettez le certificat et Lib du SDK de paiement WeChat Thinkphp, le répertoire est


PHP implémente le partage de code de développement de la fonction de paiement WeChat
Présentons maintenant le problème du répertoire d'autorisation de paiement WeChat. La première consiste à remplir. le répertoire d'autorisation de paiement dans la configuration de développement des paiements WeChat,


PHP implémente le partage de code de développement de la fonction de paiement WeChatRenseignez ensuite le domaine de sécurité de l'interface js.


PHP implémente le partage de code de développement de la fonction de paiement WeChatEnfin définir l'autorisation Web

PHP implémente le partage de code de développement de la fonction de paiement WeChat

PHP implémente le partage de code de développement de la fonction de paiement WeChat

Une fois ces paramètres terminés, c'est essentiellement à moitié fait. Faites attention au répertoire défini et au répertoire dans mon thinkphp.

PHP implémente le partage de code de développement de la fonction de paiement WeChat

4. Configuration du paiement WeChat

PHP implémente le partage de code de développement de la fonction de paiement WeChat

Remplissez correctement la configuration correspondante. .




[php] voir simplecopie


  1. /**

  2. * Configurer les informations du compte

  3. */

  4. classe WxPayConfig

  5. {

  6. //========[Paramètres des informations de base]=================== = =================

  7. //

  8. /**

  9. * À FAIRE : Modifiez la configuration ici pour demander vos propres informations de marchand

  10. * Informations sur le compte public WeChat configuration

  11. *

  12. * APPID : APPID lié au paiement (doit être configuré, visible dans l'email d'ouverture du compte)

  13. *

  14. *MCHID : Identifiant du commerçant (doit être configuré, peut être consulté dans l'e-mail d'ouverture du compte)

  15. * )

  16. * Adresse de réglage : https://pay.weixin .qq.com/index.php/account/api_cert

  17. *

  18. * APPSECRET : sécert de compte public (requis uniquement pour le paiement JSAPI, connectez-vous à la plateforme publique et entrez dans le centre de développement pour définir),

  19. * Obtenir l'adresse : 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 CLÉ = ''

  24. const APPSECRET = '';

  25. //==== ===【Paramètres du chemin du certificat】=======================================

  26. /**
  27. * TODO : Définir le chemin du certificat marchand

  28. * Chemin du certificat, veuillez noter que le chemin absolu doit être renseigné ( uniquement requis pour les remboursements et les annulations de commandes, vous pouvez vous connecter au téléchargement de la plateforme marchand,

  29. * Adresse de téléchargement du certificat API : https://pay.weixin.qq.com/index.php/account/api_cert, vous devez installer le certificat d'opération marchand avant téléchargement)

  30. * @var path

  31. */

  32. const SSLCERT_PATH = './cert/apiclient_cert.pem';>'../cert/apiclient_key.pem'

    >
  33. //========[paramètres du proxy curl]======================== ========= ===

    /**
  34. * À FAIRE : Définissez la machine proxy ici, définissez-la uniquement lorsque vous avez besoin d'un proxy. Si vous n'avez pas besoin d'un proxy. , veuillez le définir sur 0.0.0.0 et 0

    * Cette routine utilise la méthode HTTP POST via curl, et le serveur proxy peut être modifié ici,
  35. * Par défaut CURL_PROXY_HOST=0.0.0.0 et CURL_PROXY_PORT=0, le proxy n'est pas activé pour le moment (défini si nécessaire)
  36. * @var inconnu_type
  37. */
  38. const CURL_PROXY_HOST = "0.0.0.0";// CURL_PROXY_PORT = 0; //8080;

  39. //========【Configuration des informations du rapport】======================= =========== ====

  40. /**

  41. * TODO : niveau de rapport d'appel d'interface, rapport d'erreur par défaut (remarque : le délai d'expiration du rapport est de [1s], rapport quel que soit le succès ou échec [Ne jamais lancer d'exception],
  42. * n'affectera pas le processus d'appel de l'interface), après avoir activé le rapport, il est pratique pour les appels de demande de surveillance WeChat Pour la qualité, il est recommandé d'au moins
  43. * Activer le rapport d'erreurs.
  44. * Niveau de rapport, 0. Fermer le rapport ; 1. Seules les erreurs sont signalées ; 2. Rapport complet
  45. * @var int
  46. */
  47. const REPORT_LEVENL = 1;

    }

Commencez à publier le code maintenant :




>[php] vue simple copie


  1. espace de noms WechatController ;

  2. utiliser ThinkController; >/**

  3. * Le contrôleur de classe parent doit hériter

  4. * @file ParentController.class.php

  5. * @auteur Gary 🎜>

  6. * @date 4 août 2015

  7. * @todu

  8. */

  9. classe ParentController étend Contrôleur { 

  10. protégé $options = tableau (

  11. 'jeton' => 🎜>// Remplissez la clé que vous avez définie

    'encodingaeskey'
  12. =>

    '', // Remplissez la clé EncodingAESKey pour le cryptage

    'appid'
  13. =>

    '', // Remplir en avancé L'identifiant de l'application de la fonction appelante

    'appsecret'
  14. => ;

    '', // Remplissez la clé de la fonction d'appel avancée

  15.  'debug' => false,  

  16.  'logcallback' => ''  

  17.  );   

  18.  public $errCode = 40001 ;   

  19.  public $errMsg = "pas d'accès" ;   

  20.   

  21.  /** 

  22.  * 获取access_token 

  23.  * @return mixte|booléen|inconnu 

  24.  */   

  25.  public fonction getToken(){  

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

  27.  si(!vide( $cache_token)){  

  28.  retour $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, vrai);   

  34.  si(vide($résultat)){  

  35.  retour faux ;  

  36.  }   

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

  38.  retour $result['access_token'];  

  39.  }  

  40.   

  41.  /**

  42. * Envoyer un message au service client

  43. * @param array $data message structure {"touser":"OPENID","msgtype":"news","news":{...}}

  44. */  

  45.  public  fonction sendCustomMessage($data){  

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

  47.  si (vide($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.  si ($résultat)  

  52.  {  

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

  54.  si (!$json || !vide($json['errcode'])) {  

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

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

  57.  retour faux ;  

  58.  }  

  59.  retour $json;  

  60.  }  

  61.  retour FAUX;  

  62.  }  

  63.   

  64.  /**

  65. * Envoyer un modèle de message

  66. * @param inconnu $data

  67. * @return boolean|inconnu

  68. */  

  69. public fonction sendTemplateMessage($data){  

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

  71.  si (vide($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.  si (!$json || !vide($json['errcode'])) {  

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

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

  81.  retour faux ;  

  82.  }  

  83.  retour $json;  

  84.  }  

  85.  retour FAUX;  

  86.  }  

  87.   

  88.   

  89.  public function getFileCache($name){  

  90.  return S($name);  

  91.  }  

  92.   

  93.  /**

  94. * L'API WeChat ne prend pas en charge la structure json échappée en chinois

  95. * @param array $arr

  96. */  

  97.  statique  fonction json_encode($arr) {  

  98.  $parts = tableau ();  

  99.  $is_list = false ;  

  100.  //Découvrez si le tableau donné est un tableau numérique  

  101.  $keys = array_keys ( $arr );  

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

  103.  if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //Vérifiez si la première clé est 0 et la dernière clé a la longueur - 1  

  104.  $is_list = true ;  

  105.  pour($i = 0; $i compte ( $clés );  $i ++) { //Voir si chaque touche correspond à sa position  

  106.   if ($i != $keys [$i ]) { //Une clé échoue lors de la vérification de position.  

  107.   $is_list = faux ; //C'est un tableau associatif.  

  108.   pause ;  

  109.  }  

  110.  }  

  111.  }  

  112.  foreach ( $arr comme $clé =>  $valeur ) {  

  113.  if (is_array ( $value )) { //Gestion personnalisée pour les tableaux  

  114.  if ($is_list)  

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

  116.  autre

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

  118.  } autre {  

  119.  $str = '';  

  120.  if (! $is_list)  

  121.   $str = '"' .  $clé .  '":';  

  122.  //Gestion personnalisée pour plusieurs types de données  

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

  124.   $str .= $value//Nombres  

  125.  elseif ( $value === false)  

  126.  $str .= 'faux'//Les booléens  

  127.  elseif ($value === true)  

  128.  $str . = 'vrai' ;  

  129.  autre  

  130.   $str .= '"' . addslashes ( $value ) .  '"' ; //Toutes les autres choses  

  131.  // :À FAIRE : Y a-t-il plus type de données que nous devrions surveiller ? (Objet ?)  

  132.  $parts [] = $str;  

  133.  }  

  134.  }  

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

  136.  if ($is_list)  

  137. retour '[' $json ']'> retour

    '{'
  138. .

    $json . '}' //Retour JSON associatif }

  139. >
  140. +--------------------------------- ------- ---------------------
  141. * Générer une chaîne aléatoire

  142. +----------------- --------- -------------------------------

  143. * @param int $length La longueur de la chaîne aléatoire à générer

  144. * @param string $type Type de code aléatoire : 0, chiffres + lettres majuscules et minuscules ; 1, chiffres ; 2, lettres minuscules ; 4, caractères spéciaux ; -1, chiffres + lettres majuscules et minuscules + caractères spéciaux

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

  146.  * @ chaîne de retour 

  147.  +----------------------- ----------------------------------- 

  148.  */  

  149.  statique public function randCode($length = 5, $ tapez = 2){  

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

  151.  if ($type == 0) {  

  152.  array_pop($arr);  

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

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

  155.  $string = imploser(""$arr);  

  156.  } autre {  

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

  158.  }  

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

  160.  $code = '';  

  161.  pour ($i = 0; $i $length$i++) {  

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

  163.  }  

  164.  retour $code;  

  165.  }   

  166.   

  167.   

  168.  /** 

  169.  * GET 请求 

  170.  * @param string $url 

  171.  */  

  172.  privé fonction http_get($url){  

  173.  $oCurl = curl_init();  

  174.  si(stripos($url,"https://")!==FALSE){  

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

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

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

  178.  }   

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

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

  181.  $sContent = curl_exec($oCurl) ;  

  182.  $aStatus = curl_getinfo($oCurl) ;  

  183.  curl_close($oCurl);  

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

  185.  retour $sContent ;  

  186.  }autre{  

  187.  retour faux ;  

  188.  }  

  189.  }  

  190.  /**

  191. *Demande POST

  192. * @param string $url

  193. * @param array $param

  194. * @param boolean $post_file S'il faut télécharger le fichier

  195. * @return string content

  196. */  

  197.  privé fonction http_post($url,$param,$post_file=false){  

  198. $oCurl = curl_init();  

  199.  si(stripos($url,"https://")!==FALSE){  

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

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

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

  203.  }  

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

  205.  $strPOST = $param;  

  206.  } autre {  

  207.  $aPOST = tableau();  

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

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

  210.  }  

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

  212.  }  

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

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

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

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

  217.  $sContent = curl_exec($oCurl) ;  

  218.  $aStatus = curl_getinfo($oCurl) ;  

  219.  curl_close($oCurl);  

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

  221.  retour $sContent ;  

  222.  }autre{  

  223.  retour faux ;  

  224.  }  

  225.  }  

  226. }  




[php] voir simple copie


  1. espace de noms WechatController ;  

  2. utiliser WechatControllerParentController ;  

  3. /**

  4. * Contrôleur de test de paiement WeChat

  5. * @file TestController.class.php

  6. * @auteur Gary

  7. * @date 4 août 2015

  8. * @todu

  9. */  

  10. classe TestController s'étend ParentController {  

  11.  privé $_order_body = 'xxx';  

  12.  privé $_order_goods_tag = 'xxx';  

  13.  public fonction __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 fonction index(){

  20. //①, Obtenir l'identifiant de l'utilisateur

  21. $tools = nouveau JsApiPay(

  22. $openId = $tools->GetOpenid(); > //②, Ordre unifié

  23. $input

    =
  24. nouveau

    WxPayUnifiedOrder(> $input

    ->SetBody(
  25. $this

    -> ;_order_body);

  26. //Données supplémentaires, vous pouvez ajouter les données dont vous avez besoin, WeChat renverra le rappel asynchrone Joindre ces données

  27. $input->SetAttach('xxx'

  28. //Numéro de commande du marchand

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

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

  31. $input

    ->SetTotal_fee(1);

  32. //Heure de début de la transaction

  33. $ input

    ->SetTime_start(date(

    "YmdHis"
  34. ));

    //Heure de fin de la transaction

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

  36. //Étiquette du produit

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

  38. //Adresse de notification, recevoir l'adresse de rappel de notification asynchrone du paiement WeChat SITE_URL=http://test .paywechat.com/Charge

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

    $notify_url
  40. ); / /Type d'échange

  41. $input->SetTrade_type(

    "JSAPI"
  42. $openId); ;

  43. $order = WxPayApi::unifiedOrder($input

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

  45. //Obtenir les paramètres de la fonction js de l'adresse de livraison partagée

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

  47. this->assign(

  48. 'openId'
  49. ,$openId); $this->assign(

  50. 'jsApiParameters'
  51. , $jsApiParameters 'editAddress'); ,$editAddress);

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

  53.  /**

  54. * Méthode de rappel de notification asynchrone

  55. */

  56. public

  57. fonction

    notifier (){ require_once

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

    ; > PayNotifyCallBack();

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

  60. //Le IsSuccess voici une méthode que j'ai personnalisée. Je publierai le code de ce fichier plus tard pour référence. .
  61. $is_success
  62. = $notifier ->EstSuccès();

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

  64.  //支付成功  

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

  66.  $news = array(  

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

  68.   'msgtype' =>  'actualités',  

  69.   'actualités' =>  tableau (  

  70. 'articles'=> tableau (

  71. tableau(

  72. 'titre' => 'Commande payée avec succès', >'description'

  73. "Montant du paiement : {$bdata['total_fee']}n"
  74. . "Numéro de commande WeChat : {$bdata['transaction_id']}n"

  75. 'picurl' => 🎜>,

  76. 'url' =>

  77. )

    )
  78. )
  79. );
  80. //Envoyer une notification de paiement WeChat

  81. $this->sendCustomMessage($news > }else

    {
  82. /) /Échec du paiement

  83. /**

  84. * Page de réussite du paiement

  85. * Rappels peu fiables

  86. */

  87. public
  88. fonction ajax_PaySuccess(){

  89. //Numéro de commande

  90. $out_trade_no
  91. = I('post.out_trade_no'

    );
  92. //Montant du paiement total_fee = I(

  93. 'post.total_fee'
  94. ); /*Traitement logique associé*/

  95. Coller le modèle HTML


[xhtml]

vue simple
copie



html

    >
  1.  tête

  2. >
  3.  

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

  5.  méta nom="viewport" contenu="width= largeur de l'appareil, initial-scale=1"/>   

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

  7. script type= "text/javascript">

  8. //Appelez le paiement de l'API WeChat JS

  9. fonction jsApiCall()

  10. {

  11. WeixinJSBridge.invoke(

  12. 'getBrandWCPayRequest',

  13. {$jsApiParameters},

  14. fonction(res){

  15. WeixinJSBridge.log( res.err_msg);

  16. //Annuler le paiement

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

  18. //Logique d'événement pour le traitement de l'annulation du paiement

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

  20. /*Utilisez la méthode ci-dessus pour déterminer le retour frontal. L'équipe WeChat rappelle solennellement :

  21. res. .err_msg sera utilisé lorsque l'utilisateur paie. Retourne ok après succès, mais cela ne garantit pas qu'il est absolument fiable

  22. Ici, vous pouvez utiliser Ajax pour soumettre l'arrière-plan et traite certains journaux, tels que ajax_PaySuccess dans la méthode du contrôleur de test

  23. */

  24. alert(res. err_code+res.err_desc+res.err_msg); 🎜>
  25. );

  26.  }  

  27.   

  28.  fonction callpay()  

  29.  {  

  30.  si (typeof WeixinJSBridge  == "undefined"){  

  31.  if( document.addEventListener ){  

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

  33.  }else if (document.attachEvent){  

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

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

  36.  }  

  37.  }autre{  

  38.  jsApiCall();  

  39.  }  

  40.  }  

  41.  //获取共享地址  

  42. fonction editAddress()  

  43.  {  

  44.  WeixinJSBridge.invoke(  

  45.  'editAddress',  

  46.  {$editAddress},  

  47.  fonction(res){  

  48.  var value1 = res.proviceFirstStageName;  

  49.  var value2 = res.addressCitySecondStageName;  

  50.  var value3 = res.addressCountiesThirdStageName;  

  51.  var value4 = res.addressDetailInfo;  

  52.  var tel = res.telNumber;   

  53.  alerte(valeur1 + valeur2 + valeur3 + valeur4 + ":" + tel);  

  54.  }  

  55.  );  

  56.  }  

  57.   

  58.  window.onload = fonction(){  

  59.  if (typeof WeixinJSBridge == "undefined"){  

  60.  if( document. addEventListener ){  

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

  62.  }else if (document.attachEvent){  

  63.  document.attachEvent(' WeixinJSBridgeReady', modifierAdresse);   

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

  65.  }  

  66.  }autre{  

  67.  modifierAdresse();  

  68.  }  

  69.  } ;  

  70.   

  71.  script>  

  72. tête >  

  73. corps >  

  74.  br/>   

  75. police couleur= "#9ACD32">b>Le montant du paiement pour cette commande est de span style="couleur:#f00;font-size:50px " >1 pointspan>argent b>font>br/>br/>

  76.  p aligner= "centre">  

  77.  bouton  style="width:210px; height:50px; border-radius : 15px;background-color:#FE6714; border :  onclick="callpay()" >立即支付bouton>    p

  78. >
  79.   

  80. corps>

  81. html>

Code du fichier notify.php, voici une méthode personnalisée nouvellement ajoutée dans le fichier officiel.




[php] vue simple copie


  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. $logHandlernouveau CLogFileHandler(ROOT_PATH." /logs/".date('Y-m-d'). '.log');  

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

  8.   

  9. classe PayNotifyCallBack étend WxPayNotify  

  10. {  

  11.  protégé $para = array ('code'=>0,'data'=>'' );  

  12.  //查询订单  

  13.  public function Queryorder($transaction_id)  

  14.  {  

  15.  $input =  nouveau 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"] == " SUCCÈS"  

  22.  && $result["result_code "] == "SUCCÈS")  

  23.  {  

  24.  retour vrai ;  

  25.  }  

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

  27. $this->para['données'] = '';

  28. retour faux; 🎜>

  29.  

  30. //Réécrire la fonction du gestionnaire de rappel

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

  32. {

  33. Log::DEBUG(

    "appel retour : " .json_encode($data));

  34. $notfiyOutput = tableau();

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

  36. $msg = "Les paramètres d'entrée sont incorrects"

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

  38. $this->para['données'] = '';

  39. retour faux; 🎜>

  40. }  

  41. //Interroger la commande pour déterminer si la commande est authentique Sexe

  42. if(!$this->Queryorder($ données["transaction_id"])){

  43. $msg = "Échec de la requête de commande"

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

  45. $this->para['data'] = ''

  46. retour faux; > }

  47. $this
  48. ->para[

    'code'] = 1

  49. $this->para['data'] = $données; 🎜>

  50.  

  51. /**

  52. * Méthode personnalisée pour détecter si le rappel sur WeChat réussit
  53. * @return multitype:chaîne numérique
  54. */
  55. public

    fonction IsSuccess(){

  56. retourner $this->para

    }
  57. C'est fondamentalement terminé, vous pouvez ouvrir http://test.paywechat sur WeChat com/Charge/index.php/Test/index/Related. recommandations :

  58. Explication détaillée de l'implémentation nodejs de l'exemple de fonction de paiement WeChat

    Thinkphp intègre la fonction de paiement WeChat

    Comment ajouter cette fonction de paiement WeChat au site Web du PC

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal