ホームページ バックエンド開発 PHPチュートリアル Alipay の即時決済インターフェースとドッキングした thinkPHP フレームワークのコールバック問題の分析

Alipay の即時決済インターフェースとドッキングした thinkPHP フレームワークのコールバック問題の分析

Jun 08, 2018 pm 01:56 PM
thinkphp アリペイ

这篇文章主要介绍了thinkPHP框架对接支付宝即时到账接口回调操作,结合实例形式分析了thinkPHP针对支付宝接口回调操作的原理与具体操作步骤,需要的朋友可以参考下

本文实例讲述了thinkPHP框架对接支付宝即时到账接口回调操作。分享给大家供大家参考,具体如下:

关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验。

我在开发二代旅游CMS的时候,在回调的时候,也花了不少时间。

不管是支付宝接口好是微信支付接口,回调都分为跳转回调和异步通知回调,跳转回调是不保险的,加入客人支付完成后马上把支付页面关闭,没跳转,就通知不到你这个订单已经支付了,所以我们要用异步通知回调:

$alipay_config['notify_url'] = "".$ss['web_url']."/v.php/Index-alipay_notify_url.html";
ログイン後にコピー

首先设置介绍异步回调的地址

异步回调的具体处理函数,我这里也贴处理,供参考:

/* 支付宝异步通知*/
public function alipay_notify_url()
{
  vendor('Alipay.Corefunction');
  vendor('Alipay.Md5function');
  vendor('Alipay.Notify');
  vendor('Alipay.Submit');
  $info=M('rewrite')->where(array('name'=>'alipay'))->find();
  $info=json_decode($info['content'],true);;
  //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config['partner']    = $info['alipay_pid'];
//收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
$alipay_config['seller_id'] = $info['alipay_pid'];
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config['key'] = $info['alipay_key'];
$ss=S('config');
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['notify_url'] = "".$ss['web_url']."/v.php/Index-alipay_notify_url.html";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['return_url'] = "".$ss['web_url']."/member.php";
//签名方式
$alipay_config['sign_type'] = strtoupper('MD5');
//字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= strtolower('utf-8');
//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
$alipay_config['transport'] = 'http';
// 支付类型 ,无需修改
$alipay_config['payment_type'] = "1";
// 产品类型,无需修改
$alipay_config['service'] = "create_direct_pay_by_user";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数
$alipay_config['anti_phishing_key'] = "";
// 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
$alipay_config['exter_invoke_ip'] = "";
  $alipayNotify = new \AlipayNotify($alipay_config);
  $verify_result = $alipayNotify->verifyNotify();
  if($verify_result) {//验证成功
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //请在这里加上商户的业务逻辑程序代
  //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
  //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
  //商户订单号
  $out_trade_no = $_POST['out_trade_no'];
  //支付宝交易号
  $trade_no = $_POST['trade_no'];
  //交易状态
  $trade_status = $_POST['trade_status'];
  $total_fee=$_POST['total_fee'];
  //if( $info['alipay_pid']!=$seller_id) return ''; //收款账户不一致
  $info=M('order')->where(array('no'=>$out_trade_no))->find();
  if(!$info) return ''; //订单号不存在
  if($_POST['trade_status'] == 'TRADE_FINISHED') {
    //判断该笔订单是否在商户网站中已经做过处理
      //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
      //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
      //如果有做过处理,不执行商户的业务程序
       $data='';
      $data['status']=2;
      $data['pay_price']=$total_fee;
      $data['pay_type']='支付宝';
      $data['buyer']=$_POST['buyer_email'];
      $data['trade_no']=$trade_no;
      $data['pay_time']=time();
      M('order')->where(array('no'=>$out_trade_no))->save($data);
      $c=M('smtp_templates')->where(array('id'=>5))->find();
      if($c['status']==1)
      {
        $content = str_replace('{title}', $info['goods_name'], $c['content']);
        $content = str_replace('{id}', $info['goods_id'], $content);
        $content = str_replace('{price}',$total_fee, $content);
        $content = str_replace('{time}',date('Y-m-d H:i:s',time()), $content);
       $c=M('email_note')->where(array('pay_id'=>$out_trade_no))->find();
       if(!$c)
       {
       $e='';
       $e['email']=$info['c_email'];
       $e['content']=$content;
       $e['pay_id']=$out_trade_no;
       M('email_note')->add($e);
       $m=explode('|',$c['ather']);
       foreach($m as $mail)
       {
        if(validate_email($mail))
        {
         $e['email']=$mail;
         M('email_note')->add($e);
        }
       }
       }
      }
    //注意:
    //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
    //调试用,写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  }
  else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
    //判断该笔订单是否在商户网站中已经做过处理
      //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
      //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
      //如果有做过处理,不执行商户的业务程序
      $data='';
      $data['status']=2;
      $data['pay_price']=$total_fee;
      $data['pay_type']='支付宝';
      $data['buyer']=$_POST['buyer_email'];
      $data['trade_no']=$trade_no;
      $data['pay_time']=time();
      M('order')->where(array('no'=>$out_trade_no))->save($data);
       $c=M('smtp_templates')->where(array('id'=>5))->find();
      if($c['status']==1)
      {
        $content = str_replace('{title}', $info['goods_name'], $c['content']);
        $content = str_replace('{id}', $info['goods_id'], $content);
        $content = str_replace('{price}',$total_fee, $content);
        $content = str_replace('{time}',date('Y-m-d H:i:s',time()), $content);
       $c=M('email_note')->where(array('pay_id'=>$out_trade_no))->find();
       if(!$c)
       {
       $e='';
       $e['email']=$info['c_email'];
       $e['content']=$content;
       $e['pay_id']=$out_trade_no;
       M('email_note')->add($e);
       $m=explode('|',$c['ather']);
       foreach($m as $mail)
       {
        if(validate_email($mail))
        {
         $e['email']=$mail;
         M('email_note')->add($e);
        }
       }
       }
      }
    //注意:
    //付款完成后,支付宝系统发送该交易状态通知
    //调试用,写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  }
  //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  echo "success";    //请不要修改或删除
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
  //验证失败
  echo "fail";
  //调试用,写文本函数记录程序运行情况是否正常
  //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}
ログイン後にコピー

因为是异步通知,所以调试是个麻烦事,不能所见即所得,也就是说,一般情况下没办法echo或者print_r打印输出结果,没办法知道他执行到哪里或者执行结果,这个时候,我们就用到log文件输出,代码:

$file = './log.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个
$content = "支付成功".$bdata['total_fee']."\n"; //要写入的内容
file_put_contents($file, $content,FILE_APPEND);//写入文件
ログイン後にコピー

以上代码会在根目录下自动生成一个log.txt的文件,这样,就可以轻松知道执行结果,方便调试了

支付宝的异步通知接口,会多次通知,直到你返回success为止,也就是说,你提交一个测试订单,可以测试很多次,因为你没有返回success的话,他会每隔一定时间,通知一次

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于thinkphp框架实现数据添加和显示的功能方法

Thinkphp实现微信公众号支付接口

thinkPHP5.0框架访问URL的方法

以上がAlipay の即時決済インターフェースとドッキングした thinkPHP フレームワークのコールバック問題の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

TokenPocket 決済プラットフォームから Alipay または WeChat にお金を引き出す方法 TokenPocket 決済プラットフォームから Alipay または WeChat にお金を引き出す方法 Aug 29, 2024 pm 06:51 PM

はい、TokenPocket 経由で Alipay または WeChat にトークンを引き出すことができます。TokenPocket アプリを開き、「ウォレット」タブを選択します。出金したいトークンを選択し、「出金」をクリックして「Alipay」または「WeChat」を選択します。出金金額を入力し、出金アドレスを確認します。手数料を支払って出金リクエストを確認し、出金が完了するまで数分から数時間待ちます。

Bitget WalletからAlipayにお金を引き出す方法 Bitget WalletからAlipayにお金を引き出す方法 Sep 04, 2024 pm 07:25 PM

BitgetWallet を使用して Alipay にお金を引き出す手順は次のとおりです。 BitgetWallet を開いてパスワードを入力するか、指紋を使用してロックを解除します。 「引き出し」をクリックして暗号通貨を選択します。 Alipay 情報を入力し、支払い口座番号と金額を入力します。ネットワークの選択 Alipay の支払い方法に一致するネットワークを選択します。手数料設定 手数料金額を確認し、承諾します。検査情報を確認して送信し、「確認」をクリックします。確認待ちはブロックチェーンネットワークによる検証を待ちます。受け取った資金の出金は、Alipay 支払いアカウントに入金されます。

セサミオープンドアログイン登録登録ゲート。io交換登録公式ウェブサイトの入り口 セサミオープンドアログイン登録登録ゲート。io交換登録公式ウェブサイトの入り口 Mar 04, 2025 pm 04:51 PM

Gate.io(Sesame Open Door)は、世界をリードする暗号通貨取引プラットフォームです。このチュートリアルでは、アカウントの登録とログイン、KYC認定、FIAT通貨とデジタル通貨充電、取引ペアの選択、制限/市場取引注文、注文およびトランザクションレコードの表示などの手順を把握しているため、暗号通貨取引のためのgate.ioプラットフォームを迅速に開始できます。 初心者であろうとベテランであろうと、このチュートリアルから利益を得て、gate.ioの取引スキルを簡単に習得できます。

Bitget Wallet Bitpie 決済プラットフォームから Alipay または WeChat にお金を引き出す方法 Bitget Wallet Bitpie 決済プラットフォームから Alipay または WeChat にお金を引き出す方法 Sep 04, 2024 pm 06:57 PM

BitgetWallet を通じて Alipay または WeChat にお金を引き出すにはどうすればよいですか? 1. BitgetWallet 支払いプラットフォームにログインします。 2. 出金する資産を選択します。 3. 「出金」ボタンをクリックします。 4. 出金方法 (Alipay または WeChat) を選択します。 5. 出金金額と支払い口座番号を入力します。 ; 6. 確認して送信します。

OUYI Exchange App国内ダウンロードチュートリアル OUYI Exchange App国内ダウンロードチュートリアル Mar 21, 2025 pm 05:42 PM

この記事では、中国のOUYI OKXアプリの安全なダウンロードに関する詳細なガイドを提供します。国内のアプリストアの制限により、ユーザーはOUYI OKXの公式Webサイトからアプリをダウンロードするか、公式Webサイトが提供するQRコードを使用してスキャンおよびダウンロードすることをお勧めします。ダウンロードプロセス中に、公式Webサイトのアドレスを確認し、アプリケーションの許可を確認し、インストール後にセキュリティスキャンを実行し、2要素の検証を有効にしてください。 使用中は、地方の法律や規制を遵守し、安全なネットワーク環境を使用し、アカウントのセキュリティを保護し、詐欺に対して警戒し、合理的に投資してください。 この記事は参照のみであり、投資のアドバイスを構成していません。

仮想コインの購入方法は? 2025イーサリアム仮想通貨新人ガイド 仮想コインの購入方法は? 2025イーサリアム仮想通貨新人ガイド Feb 21, 2025 pm 06:54 PM

暗号通貨の世界に新しい投資家にとって、仮想コインの購入方法を理解することが重要です。この記事は、適切な交換の選択、アカウントの登録、預金資金、および購入イーサリアム(ETH)の選択方法に関する詳細な手順をカバーする初心者への包括的なガイドを提供するように設計されています。このガイドに従うことにより、初心者は仮想通貨投資の旅に安全かつ便利に着手し、2025年以降に潜在的な投資機会を押収することができます。

アリパイでビットコインを購入する方法は? AlipayはBTC完全なチュートリアルを購入します アリパイでビットコインを購入する方法は? AlipayはBTC完全なチュートリアルを購入します Mar 05, 2025 pm 06:03 PM

AlipayおよびBitcoinトランザクション:安全で便利な購入ガイドAlipayは、中国で広く使用されている支払いツールですが、ビットコインなどの暗号通貨の直接購入をサポートしていません。この記事では、Alipayを使用してビットコインを安全かつ便利に購入する方法について説明し、注意が必要なリスクを説明します。暗号通貨取引所を通じてビットコインを間接的に購入する最も一般的な方法は、Alipayをサポートする暗号通貨取引所を通じて取引することです。この方法では、通常、最初にUSDT(Stablecoin)を購入し、次にUSDTをビットコインと交換する必要があります。以下はOUYI OKX Exchangeの例です。操作の手順を詳細に説明します。OUYIOKXアカウントを登録:OUYI OKX公式Webサイトにアクセスして(クリックして登録)、メールアドレスを使用してアカウントを登録し、完了してください

OKXトレーディングプラットフォームの取り扱い料金のリスト OKXトレーディングプラットフォームの取り扱い料金のリスト Feb 15, 2025 pm 03:09 PM

OKXトレーディングプラットフォームは、取引手数料、引き出し料金、資金調達料金など、さまざまな料金を提供しています。スポットトランザクションの場合、取引手数料はトランザクションのボリュームとVIPレベルによって異なり、「マーケットメーカーモデル」を採用します。つまり、市場はトランザクションごとに低いハンドリング料金を請求します。さらに、OKXは、通貨標準契約、USDT契約、配送契約など、さまざまな先物契約も提供しており、各契約の料金構造も異なります。

See all articles