Maison  >  Article  >  Applet WeChat  >  Introduction détaillée au programme de développement d'interface de paiement php WeChat

Introduction détaillée au programme de développement d'interface de paiement php WeChat

高洛峰
高洛峰original
2017-03-16 15:23:572435parcourir

L'

interface de paiement WeChat devient progressivement disponible comme Alipay. Vous pouvez utiliser l'interface api pour mettre en œuvre le paiement sur des sites Web ou des applications tiers. développement d'interface Le programme a été testé. Les amis intéressés peuvent se référer à

Explication du programme de développement d'interface de paiement PHP WeChat :

Conditions nécessaires :
appid // Obtenu depuis le centre de développement du backend du compte officiel (le même que celui dans l'email)

mchid//Obtenu dans l'email

clé/ /Défini par le backend du marchand

appsecret //Le centre de développement de compte officiel a obtenu
deux fichiers de certificat, et apiclient_cert.pem a été obtenu dans l'e-mail apiclient_key.pem
Notes  :
Paiement WeChat en arrière-plan du compte public-》Configuration du développement-》Ajouter répertoire de test et tester le compte WeChat personnel.
Centre des développeurs-"Autorisation de page Web pour obtenir des informations utilisateur de base-" Remplacez-le par votre nom de domaine de test. Sinon, une erreur de paramètre redirect_uri se produira
——————————Suivi à améliorer——————-
La page de préparation du paiement WeChat effectuée trois opérations seules en arrière-plan :

1. Get 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();
  }

I. J'ai également rencontré cela lors de la première étape lorsque j'ai commencé. Le problème est que l'openid ne peut pas être obtenu. Ceci est lié à certains serveurs. La démo utilise curl pour l'obtenir.
C'est étrange que le curl de mon serveur n'ait pas pu être obtenu. Plus tard, il a été remplacé par file_get_contents et il peut être obtenu normalement.
Mais ce n’est pas la solution. Parce que plus d'opérations curl seront nécessaires plus tard.
J'ai vu un endroit dans la documentation de développement qui nécessitait libcurl 7.20.1 ou supérieur pour les opérations de certificat. Ensuite, j'ai travaillé sur le serveur pour améliorer la version php curl de linux. En fin de compte, je viens de passer à un autre serveur Windows.
Faisons cela pour le moment et déboguons la prochaine fois que vous aurez besoin de l'utiliser.

Étape 2 : Obtenir et payer l'identifiant du numéro de commande
Le code est le suivant


$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);

Cette étape est également rencontré Tant de questions.
Tout d'abord, il est difficile de tester le paiement WeChat, et il ne peut être testé que dans WeChat. J'utilise simplement mon téléphone pour glisser.
Deuxièmement, il n'est pas facile d'utiliser var_dump pour le débogage. Imprimez certains fichiers au format xml et affichez uniquement la longueur des caractères, pas le contenu. Je l'ai donc écrit sous forme de log pour le débogage sur le serveur. Le code du log :
Le code est le suivant


// 打印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);
  }

Utilisez $this->. dans WxPayPubHelper.php dans la démo ;log_d(xxx);
Au début, j'avais toujours des erreurs car les mchid et appid qui m'étaient donnés ne correspondaient pas. . Ils m'ont donné un mauvais numéro de compte. Au début, je ne savais pas essayer au hasard. Pour cette étape de débogage, vous pouvez voir le code d'erreur dans var_dump($this->result); dans getPrepayId().

Étape 3 : Générez le code js du front-end de paiement et mettez-le sur la page Web :
Le code est le suivant


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

——————-Cliquez pour payer————————-

J'ai rencontré un autre problème dans ce domaine partie :
androidrenvoie "System : Access_denied", ios renvoie "access_control:not_allowed"
J'ai beaucoup cherché sur Baidu. En fait, je vois cette chose depuis longtemps et je ne l'ai jamais remarqué !
La page qui initie la demande d'autorisation doit être une page du répertoire d'autorisation et ne peut pas exister dans un sous-répertoire. Sinon, une erreur sera renvoyée
J'ai placé le fichier de paiement dans /domain name/pay/demo/
Au début, j'ai continué jusqu'à la fin de /domain name/pay/ et j'ai pensé que c'était suffisant. Supporte les sous-répertoires, le résultat n'est pas possible ! .
————————Regardez enfin l'image ci-dessous————

wxpay1
wxpay3
wxpay2

—— ————xmljs en cours————————
Identifiant d'ordre de génération et de paiement à soumettre :
Le code est le suivant


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

Soumettre Le retour est correct, qui contient 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 pour générer le paiement :


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

Notification xml renvoyée après paiement réussi :


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

Je suis libre d'utiliser les données dans ce document, veuillez vous référer au format ci-dessous. Notez également qu'il est sensible à la casse.

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!

Déclaration:
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