Maison  >  Article  >  développement back-end  >  Comment implémenter la fonction de paiement Alipay en PHP (explication détaillée avec images et texte)

Comment implémenter la fonction de paiement Alipay en PHP (explication détaillée avec images et texte)

卡哇伊
卡哇伊original
2020-07-06 10:39:194123parcourir

Fonction de paiement Alipay implémentée en PHP : combinée à l'exemple d'analyse de formulaire, PHP utilise l'interface Alipay pour implémenter la fonction de paiement. Tout d'abord, le code de l'interface est organisé pour assurer la stabilité de l'opération puis la signature. la vérification dans le traitement de rappel réalise la fonction en vérifiant les paramètres accomplis.

Comment implémenter la fonction de paiement Alipay en PHP (explication détaillée avec images et texte)

Détails du problème :

L'exemple de cet article décrit la fonction de paiement d'Alipay implémentée en PHP.

Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Lors de la création de l'interface de paiement Alipay pour l'application, le contenu collecté est organisé comme suit :

Interface :

import('alipay.AopClient', EXTEND_PATH);
import('alipay.request.AlipayTradeAppPayRequest', EXTEND_PATH);
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = Config::get('alipay.app_id');
$aop->rsaPrivateKey = Config::get('alipay.rsa_private_key');
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = Config::get('alipay.alipay_rsa_public_key'); //Config::get('alipay.rsa_public_key'); //
$request = new \AlipayTradeAppPayRequest();
$bizcontent = json_encode([
  'body' => '红包支付',
  'subject' => '用户红包支付',
  'out_trade_no' => $orderSn,
  'timeout_express' => '30m',
  'total_amount' => $amount,
  'product_code' => 'QUICK_MSECURITY_PAY'
]);
$request->setNotifyUrl("https://" . $_SERVER['HTTP_HOST'] . "/api/callback/alipay");
$request->setBizContent($bizcontent);//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
$return['aliresponse'] = $response;//htmlspecialchars($response);//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
$this->returnSuccess($return);

Traitement des rappels :

public function alipay()
{
    import('alipay.AopClient', EXTEND_PATH);
    $aop = new \AopClient();
    $aop->alipayrsaPublicKey = Config::get('alipay.alipay_rsa_public_key');// file_get_contents($_SERVER['DOCUMENT_ROOT']."/key/alipay/alipay_public_key.txt");
    $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
    if ($flag){
      //验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id
      if (isset($_POST['trade_status']) && ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') ) {
        // 业务处理
      } else {
        $msg = var_export($_POST, true);
        $fileName = mt_rand(10,1000) .'00alisuccessAnother.log' ;
        file_put_contents($fileName, $msg);
      }
      echo "success";
    } else {
      $msg = var_export($_POST, true);
      $fileName = mt_rand(10,1000) .'00alicheckSignFail.log';
      file_put_contents($fileName, $msg);
    }
}

Plus de recommandations d'apprentissage : Pratique de paiement en ligne avec paiement instantané Alipay Tutoriel vidéo de développement de projet

Pièce jointe : les rappels asynchrones des paiements Alipay et WeChat sont toujours appelés

J'ai développé Paiement Alipay récemment, et les travaux préliminaires sont terminés. C'est fait, mais lorsque le rappel asynchrone prend la valeur, le rappel asynchrone continue d'appeler, ce qui entraîne le stockage répété de mes données dans la base de données. Après y avoir soigneusement réfléchi, une solution qui. qui me vient immédiatement à l'esprit est d'ajouter une autre valeur dans le rappel asynchrone. Après chaque rappel pour obtenir les données, interrogez la base de données pour voir s'il y a des données, mais ne les enregistrez pas à nouveau. réfléchissez bien, c'est faux. Il s'agit de traiter les symptômes plutôt que la cause profonde. Non, puisqu'il y a un problème, il doit y avoir une cause profonde et une solution correcte. Alors, pour trouver la base, consultez la documentation :

1. Documentation Alipay , voici la documentation du rappel asynchrone Alipay :

Page de notification asynchrone du serveur. Fonctionnalités

Il est nécessaire de s'assurer qu'il n'y a pas de caractères sur la page de notification asynchrone du serveur (notify_url), tels que des espaces, des balises HTML, des invites d'exception lancées par le système de développement, etc.
Alipay utilise ; POST pour envoyer des informations de notification, donc les méthodes pour obtenir les paramètres sur cette page, telles que : request.Form("out_trade_no"), $_POST['out_trade_no']
Cette méthode sera activée uniquement lorsque Alipay initie activement un notification ;
Uniquement lorsque Alipay Uniquement lorsque la transaction existe dans la gestion des transactions et que le statut de la transaction change, Alipay lancera une notification du serveur via cette méthode (si le statut de la transaction instantanée est "En attente du paiement de l'acheteur", la valeur par défaut
n'enverra pas de notification );
Interaction entre les serveurs, contrairement aux notifications de synchronisation de saut de page qui peuvent être affichées sur la page, cette méthode d'interaction est invisible
Le premier changement de statut de la transaction (paiement immédiat à ce moment-là ; le statut de la transaction est transaction terminée), non seulement le résultat du traitement synchrone sera renvoyé, mais la page de notification asynchrone du serveur recevra également la notification du résultat du traitement d'Alipay
« succès » (sans guillemets) doit être imprimé après le ; le programme est exécuté. Si les caractères renvoyés à Alipay par le commerçant ne sont pas les 7 caractères de réussite, le serveur Alipay continuera à renvoyer la notification jusqu'à ce qu'elle dépasse 24 heures et 22 minutes.
Dans des circonstances normales, 8 notifications sont effectuées dans un délai de 25 heures (la fréquence d'intervalle des notifications est généralement : 4 m, 10 m, 10 m, 1h, 2h, 6h, 15h
Une fois l'exécution du programme terminée, la page) ; ne peut pas être exécuté. Si un saut de page est exécuté, Alipay ne recevra pas le caractère de réussite et le serveur Alipay déterminera que le programme de page fonctionne anormalement et renverra la notification du résultat du traitement
Les cookies, sessions, etc. seront invalides ; cette page, c'est-à-dire qu'elles ne peuvent pas être obtenues. Ces données ;
Le débogage et le fonctionnement de cette méthode doivent être sur le serveur, c'est-à-dire qu'ils sont accessibles sur Internet
La fonction de cette méthode est ; principalement pour éviter la perte de commandes, c'est-à-dire que la notification de synchronisation de saut de page ne traite pas la mise à jour de la commande, elle la traitera ;
Lorsque le commerçant reçoit la notification asynchrone du serveur et imprime le succès, le paramètre de notification asynchrone du serveur notify_id deviendra invalide. C'est-à-dire que lorsque Alipay envoie la même notification asynchrone
(y compris le fait que le commerçant n'a pas réussi à imprimer le succès et a amené Alipay à renvoyer la notification plusieurs fois), le paramètre de notification asynchrone du serveur notify_id reste inchangé.

Avez-vous vu que le programme doit être imprimé success avant qu'Alipay arrête de cracher du sang Quand j'ai revu le programme, j'ai constaté que je n'étais pas revenu success, donc dedans. le programme Une fois terminé, renvoyez simplement un success. Puisque j'utilise php, une fois le programme terminé. Utilisez simplement la phrase suivante.

eg:
echo "success";

2. Document WeChat

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
 
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知
最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
 
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。
在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
 
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
技术人员可登进微信商户后台扫描加入接口报警群。

看到没,在此文档也是,在微信的异步通知后,也需要给微信服务器,返回一个信息,只不过,微信的所有数据格式都是xml的。所以我们在返回一个数据给微信即可。

echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";

在进行返回的时候,格式没问题,可能在输出的时候,存在问题。使用下面方式即可:

echo exit(&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;);

就是这么简单,完美结局!

相关学习推荐:php视频教程

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