En parlant de WeChat Pay, je crois que tout le monde le connaît, mais quand nous voulons terminer ce programme, comment nos programmeurs devraient-ils l'écrire et l'installer? Ne vous inquiétez pas, aujourd'hui le rédacteur en chef de la nouvelle chaîne technologique du bug vous a donné un exemple, allons à l'article suivant pour en savoir plus!
Introduction: Distributeur, comment retirer de l'argent des affaires WeChat?
Payer directement avec WeChat.
La mise en œuvre est la suivante:
Configuration de paiement WeChat
/ * Paiement WeChat * / 'Pay_weixin' => Array ('appid' => 'xxxx', 'appseret' => 'xxxxxx,' mchid '=>' 1283301801 ', // Numéro de marchand' '=>' ZhudianbaoDianDia 'Conf / cert / apiclient_cert.pem', // certificat de marchand apiclient_cert.pem 'apiclient_key' => 'conf / cert / apiclient_key.pem', // certificat marchand apiclient_key.pem)arraytoxml
/ *** tableau à xml * / fonction arraytoxml ($ arr) {$ xml = "<xml>"; foreach ($ arr as $ key => $ val) {if (is_numeric ($ val)) {$ xml. = "<". $ key. ">". $ val. "</". $ key. ">"; } else $ xml. = "<". $ key. "> <! [cdata [". $ val. "]]> </". $ key. ">"; } $ xml. = "</ xml>"; retourner $ xml;}Utilisez le certificat pour soumettre le XML à l'URL d'interface correspondante dans la publication
/ *** Fonction: utilisez un certificat pour soumettre XML à l'URL d'interface correspondante * / fonction postxmlsslcurl ($ xml, $ url, $ second, $ cert, $ key) {$ ch = curl_init (); // Timeout Time curl_setopt ($ ch, curlopt_timeout, $ second? $ Second: $ this-> timeout); // Définissez le proxy ici, s'il y a un // curl_setopt ($ ch, curlopt_proxy, '8.8.8.8'); // curl_setopt ($ ch, curlopt_proxyport, 8080); curl_setopt ($ ch, curlopt_url, $ url); curl_setopt ($ ch, curlopt_ssl_verifypeer, false); curl_setopt ($ ch, curlopt_ssl_verifyhost, false); // Définir l'en-tête curl_setopt ($ ch, curlopt_header, false); // Définissez le résultat en tant que chaîne et sortie sur l'écran curl_setopt ($ ch, curlopt_returntransfer, true); // Définissez le certificat // Utilisez le certificat: certificat et clé Il appartient à deux fichiers .pem respectivement // Le format par défaut est PEM, vous pouvez annoter curl_setopt ($ ch, curlopt_sslcertType, 'pem'); curl_setopt ($ ch, curlopt_sslcert, $ Cert); // Le format par défaut est PEM, vous pouvez annoter curl_setopt ($ ch, curlopt_sslkeytype, 'pem'); curl_setopt ($ ch, curlopt_sslkey, $ key); // la méthode de soumission du post curl_setopt ($ ch, curlopt_post, true); curl_setopt ($ ch, curlopt_postfields, $ xml); $ data = curl_exec ($ ch); // Retour Résultat if ($ data) {curl_close ($ ch); retourner $ this-> xmltoArray ($ data); } else {$ error = curl_errno ($ ch); ECHO "Erreur de curl, code d'erreur: $ error". "<br>"; curl_close ($ ch); retourne false; }}Les entreprises paient des particuliers
// l'entreprise paie la fonction publique individuelle PayTouser ($ params, $ key, $ apcent_cert, $ apiclient_key) {$ url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; // Détection Paramètres requis if ($ params ["partenaire_trade_no"] == null) {// exit ("Interface d'application de remboursement, les paramètres requis partenaire_trade_no!". "<br>"); } elseif ($ params ["openId"] == null) {exit ("Interface d'application de remboursement, les paramètres requis openID!". "<br>"); } elseif ($ params ["check_name"] == null) {// no_check: pas de vérification de nom réel force_check: une vérification forte du nom réel (les utilisateurs sans réel nom authentification ne parviendront pas à vérifier, et le transfert ne peut pas être transféré) Option_Check: seuls les utilisateurs qui ont un nom réel authentifié sont vérifiés (les utilisateurs qui n'ont pas réel le nom authentifié ne sont pas vérifiés, le transfert peut être transféré) "ne fait pas un nom réel. Interface d'application, le paramètre requis Check_name est manquant! "." <br> "); } elseif (($ params ["Check_name"] == 'Force_check' ou $ params ["Check_name"] == 'Option_Check') && ($ params ["re_user_name"] == null)) {// le nom réel de l'utilisateur de paiement. Exit ("Interface d'application de remboursement, le paramètre requis re_user_name est manquant!". "<br>"); } elseIf ($ params ["montant"] == null) {exit ("Interface d'application de remboursement, le montant du paramètre requis est manquant!". "<br>"); } elseif ($ params ["desc"] == null) {exit ("Interface d'application de remboursement, le paramètre requis desc!". "<br>"); } $ params ["mch_appid"] = $ this-> appid; // public id de compte $ params ["mchid"] = $ this-> mCHID; // Numéro de marchand $ params ["nonce_str"] = $ this-> CreenonCestr (); // Random String $ params ['spbill_create_ip'] = $ _Server [' '192.127.1.1': $ _Server ['Remote_addr']; // Get ip $ params ["Sign"] = $ this-> getsign ($ params, $ key); // signature $ xml = $ this-> arraytoxml ($ params); Retour $ this-> postxmlsslcurl ($ xml, $ url, false, $ apcent_cert, $ apiclient_key);}Paiement commercial
Fonction privée _enterprisePay ($ numéro, $ membre_id, $ montant, $ desc) {// get openId $ wxuser_id = m ('membre') -> where (array ('id' => $ membre_id) -> getField ('wxuser_id'); $ openId = m ('wxuser') -> où (array ('id' => $ wxuser_id)) -> getField ('openId'); $ pay = c ('Pay_weixin'); import ('@. Action.wxDevelop'); $ enterprise = new wxEnterprise ($ pay ['appid'], $ pay ['appsecret'], $ pay ['mchid']); $ params = array ('partenaire_trade_no' => $ numéro, 'openId' => $ openId, 'check_name' => 'no_check', 'montant' => $ montant, // total 'desc' => $ desc,); $ result = $ Enterprise-> PayTouser ($ params, $ pay ['key'], $ pay ['apiclient_cert'], $ pay ['apiclient_key']); Retour $ Résultat;}Procédés de distributeurs de traitements
Fonction privée _Handle ($ truename, $ prix) {// Gire le disposal du distributeur $ retraid = date ("ymdhis"). Strval (Rand (1000, 9999)); $ data = array ('retraid' => $ retraid, 'store_id' => $ this-> store_id, 'membre_id' => $ this-> membre_id, 'truename' => $ truename, 'prix' => $ prix, 'addtime' => time ()); // pas d'audit if ($ prix> = c ('retraitement_uncheck_value')) {$ data ['Need_check'] = 0; $ data ['status'] = 1; if ($ this-> retraitmodel-> add ($ data)) {$ result = $ this -> _ Enterpripay ($ retraitId, $ this-> membre_id, $ prix * 100, 'distribution ('. $ trueename. ') se retirer'); // Après une erreur d'informations de paiement, il doit être examiné if ($ result ['return_code']! = 'Success') {$ this-> retraitmodel-> where (array ('shartId' => $ retraitId)) -> sauver (array ('Need_check' => 1, 'status' => 0)); $ this-> attribution ('succès', 2); } else {// Définir le numéro de transaction WeChat $ this-> retraitmodel-> où (array ('retraitId' => $ retrait)) -> sauvegarder (array ('PAYS_NO' => $ result ['PAYS_NO'])); // augmenter le flux de commission, à corriger $ data = array ('store_id' => $ this-> store_id, 'user_type' => 2, 'user_id' => $ this-> shop_id, 'Trade_type' => 2, 'Trade_no' => $ retraid, 'Price' => - $ Price '=> 1,' Message '=> $ TRUENNEAM. => time ()); M ('twitter_log') -> add ($ data); // Réduisez les commissions correspondantes m ('membre') -> où (array ('id' => $ this-> membre_id)) -> setin ('Money', - $ prix); $ this-> attribuer ('succès', 1); // Envoyer des messages de modification de commission Import ('@. Action.tmpplmsg'); $ tmpplmsg = new tmpplmsg (); $ tmpplmsg-> send (tmpplmsg :: prix_change, $ this-> membre_id, array ('token' => $ this-> token, 'intro' => 'Distribution Commission transfert', 'Price' => $ prix, 'business' => business)); }} else {$ this-> error ('Erreur d'information de retrait en espèces!'); }} // Une revue est requise sinon {$ this-> retraitementmodel-> add ($ data); $ this-> attribution ('succès', 2); }}Fournit la fonction des entreprises à payer aux utilisateurs, prend en charge les entreprises de payer via l'interface API ou de faire fonctionner le paiement via la fonction Web de plate-forme marchande de paiement WeChat.
Conseils aimables:
◆ Payez au même utilisateur réel, la limite quotidienne pour une seule transaction est de 2W / 2W
◆ Paiement au même utilisateur non réel, avec une seule transaction et une seule limite quotidienne de 2000/2000
◆ La limite de paiement total pour un marchand le même jour est de 100W
◆ Seules les appides qui ont été liées au numéro de marchand sont prises en charge;
◆ Pour les utilisateurs cibles du paiement, les utilisateurs qui ont été authentifiés par WeChat Pay peuvent fournir la fonction de la vérification de leurs noms réels. Les utilisateurs qui n'ont pas authentifié par des noms réels ne peuvent pas vérifier. Les entreprises peuvent choisir le type de vérification en fonction du niveau de sécurité de leur propre entreprise;
◆ Le montant du paiement doit être inférieur ou égal au montant actuellement disponible pour le marchand;
◆ Pour les enregistrements payants, les entreprises peuvent afficher les données correspondantes via la requête de paiement d'entreprise.
Arrivée
Les fonds de paiement entreront la modification de l'utilisateur cible (WECHAT-I-WALLET-Change). WeChat Pay fera une notification de changement dans le compte, et les détails des revenus et des dépenses seront affichés.
Conseils aimables:
Pour la version client historique du compte de modification, les fonds entreront le compte de l'enveloppe rouge de l'utilisateur, et WeChat Pay informera les utilisateurs sans aucun message, et les entreprises peuvent choisir d'atteindre les utilisateurs par eux-mêmes.
Lien d'interface: https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
Un certificat est-il requis
Un certificat bidirectionnel est requis pour une demande.
Exemple de données:
<xml> <mch_appid> wxe062425f740c30d8 </mch_appid> <mchid> 10000098 </mchid> <NONCE_STR> 3PG2J4ILTKCH16CQ2502SI8ZNMT M67VS </ nonce_str> <partenaire_trade_no> 100000982014120919616 </partner_trade_no> <OpenID> OHO4GT7WVPXIT1A9GJFAMYMIZ Y1s </penid> <check_name> option_check </ check_name> <re_user_name> zhang san </ re_user_name> <murm> 100 </murk> <esc> happy Holiday! </ Desc> <Spbill_create_ip> 10.2.3.10 </pbill_create_ip> <sign> c97bdbacf37622775366f38b629f45e3 </ign> </xml>
Exemple réussi:
<xml> <return_code> <! [cdata [succès]]> </ return_code> <feewerf_msg> <! [CDATA []]> </ return_msg> <mch_appid> <! [cdata [wxec38b8ff840 BD989]]> </mch_appid> <mchid> <! [CDATA [10013274]]> </mchid> <vice_info> <! [CDATA []]> </vine_info> <NONCE_STR> <! [CDATA [lxudzmnr jpcxzxlx0q]]> </ nonce_str> <setult_code> <! [cdata [succès]]> </ result_code> <partenaire_trade_no> <! [cdata [100135742015051915265824 41]]> </ partenaire_trade_no> <paim_no> <! [CDATA [1000018301201505190181489473]]> </paist_no> <Payt_time> <! [CDATA [2015-05-19 15:26:59]]> </paist_time> </xml>
Exemple d'erreur:
<xml> <return_code> <! [cdata [échoué]]> </ return_code> <fettour_msg> <! [CDATA [Le système est occupé, veuillez réessayer plus tard.]]> </ retur être
Pour plus d'informations sur le contenu lié à PHP, veuillez consulter les sujets de ce site: "Résumé des techniques d'opération de PHP WeChat", "Résumé des techniques de programmation du réseau PHP», "Introduction à PHP Basic Syntax Tutorial", "Résumé du PHP Usage", "Introduction à PHP Database Tutorial" et résumé de DATABASE " techniques "
J'espère que l'explication détaillée de la méthode de mise en œuvre du paiement du compte WeChat Enterprise dans PHP décrit dans cet article sera utile à tout le monde d'apprendre la programmation PHP. J'espère que tout le monde continuera à soutenir la mauvaise chaîne de nouvelles technologies!