Thinkphp5支付宝app支付和退款的入坑与退坑


  1. 支付宝app支付三大基本参数:  APPID; 秘钥,应用公钥;
  2. 支付宝退款三大基本参数: APPID; 秘钥,支付宝公钥;
  3. 支付宝需要自己生成唯一订单号,这个和支付宝商户中心商户订单号不一样,但成功后回调也会把我们这个发过去的订单号回调发过来,以此订单号为条件,查询订单表数据,更改订单状态;可以顺便把支付宝交易号回调过来保存数据库,后面退款需要用到.
  4. 支付宝回调地址必须公网可以访问

多的不说啦,上代码:

<?php
namespace app\index\controller;
use think\Controller;
use think\Loader;
use think\Request;
class Alipay extends Controller
{
    private $appId = '商户id';
    private $rsaPrivateKey = "商户秘钥";
    private $alipayrsaPublicKey = "商户公钥";
    private $aop;
    private $notify_url = "公网服务器域名/index/alipay/notify";
    private $alipayrsaPublicKey_zhifubao = "支护宝公钥";

    public function __construct()
    {
        parent::__construct();
        Loader::import('alipay.AopSdk');
    }

   //支付宝app退款  退款用支付宝公钥
    public function exitPay(Request $request)
    {       

          $aop = new \AopClient ();
          $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
          $aop->appId = $this->appId;
          $aop->rsaPrivateKey = $this->rsaPrivateKey;
          $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey_zhifubao;
          $aop->apiVersion = '1.0';
          $aop->signType = "RSA2";
          $aop->postCharset = 'UTF-8';
          $aop->format = "json";
          $request = new \AlipayTradeRefundRequest ();

          //需要传入的参数变量
          $trade_no  = "支付宝交易流水号";           
          $refund_fee = "退款金额";
          $out_trade_no = "支付宝订单号号";

          $request->setBizContent("{" .
            "\"trade_no\":\"{$trade_no}\"," . //支付宝交易号,和商户订单号不能同时为空 特殊可选
            "\"out_trade_no\":\"{$out_trade_no}\"," .  //订单支付时传入的商户订单号,不能和 trade_no同时为空。 特殊可选
            "\"refund_amount\":\"{$refund_fee}\"," . //需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数     必选
            "\"refund_reason\":\"订单取消-退款\"" . //退款的原因说明    正常退款 可选 最后的“,”逗号去掉
            "}");

          $result = $aop->execute($request);
          $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
          $resultCode = $result->$responseNode->code;
          if(!empty($resultCode) && $resultCode == 10000){
              //退款成功,处理订单状态以及更新退款等信息
            
               return json(['code'=>200,'msg'=>'退款成功']); 
          } else {
              return json(['code'=>400,'msg'=>'退款失败']); 
          }
    }
    
    //支付宝app支付付款  支付用的是应用公钥
    public function payOrder(Request $request)
    {   	

        $subject="测试公益付款";//商品标题
        $body = '公益事业';
        $out_trade_no = "需要自己去生成一个唯一订单号,然后支付宝回调给给我们返回来,然后用他去操作订单状态,这个跟支付宝商户中心的订单号不一样,注意了哦";
        $total_amount = 0.01;//付款金额
        $aop = new \AopClient ();
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = $this->appId;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
        $request = new \AlipayTradeAppPayRequest();
        $bizcontent = "{\"body\":\"".$body."\","
                . "\"subject\": \"".$subject."\","
                . "\"out_trade_no\": \"".$out_trade_no."\","
                . "\"timeout_express\": \"30m\","
                . "\"total_amount\": \"".$total_amount."\","
                . "\"product_code\":\"QUICK_MSECURITY_PAY\""
                . "}";       
        $request->setNotifyUrl($this->notify_url);
        $request->setBizContent($bizcontent);
       //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);        
        return json(["code" => 200, "data" =>  $response]);  
    }
    //支付宝支付成功之后异步回调处理
    public function notify()
    {     

         if ($_POST['trade_status'] == 'TRADE_SUCCESS')
          {//如果支付成功
             //===============修改订单状态===========================//         
              $orderSn = $_POST['out_trade_no'];//获取订单号             
              $data1['batch'] = $_POST['trade_no']; //交易流水号
              //根据订单号,以此为条件,修改订单状态以及存入交易流水号
              echo 'success'; //必须success结尾,否则支付宝会多次回调
              exit;
          }
    }

 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
thinkphp5 可以通过支付宝开放平台的 SDK 来对接支付宝支付功能。首先,我们需要在 thinkphp5 的项目中引支付宝 SDK,可以通过 Composer 来安装 SDK,或者手动下载 SDK 的包来引。接下来,我们需要在项目中配置支付宝支付相关的参数,如支付宝AppID、App 私钥、支付宝公钥等。这些参数可以在支付宝开放平台开发者中心进行获取。 在配置好参数后,我们可以在 thinkphp5 的控制器中编写代码来实现支付宝支付的功能。一般来说,支付宝支付的流程包括生成支付订单、跳转到支付页面、支付成功回调等步骤。我们可以通过调用支付宝 SDK 提供的相关方法来完成这些步骤。 首先,我们可以使用 SDK 提供的方法来生成支付订单,并将订单信息保存在数据库或其他地方。然后,我们可以使用 SDK 提供的方法来生成支付表单,将用户重定向到支付宝支付页面上。用户在支付页面上完成支付后,支付宝会将支付结果返回给我们的网站,我们可以通过配置支付宝回调地址,并编写回调方法来接收支付结果。 在接收到支付结果后,我们可以根据支付结果更新订单的状态,并做相应的业务逻辑处理。例如,如果支付成功,我们可以将订单状态改为已支付,并向用户展示支付成功的页面。 综上所述,通过引支付宝 SDK,配置相关参数,编写相应的代码,我们就可以在 thinkphp5 中实现支付宝支付功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值