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