下载官方SDK:/doc/sdkDownload.resource?sdkType=PHP
在支付宝所创建的应用中添加“ 电脑网站支付、手机网站支付、APP支付、转账到支付宝账户”功能
vue可参考:/qq_33026699/article/details/106069905
一、电脑网站支付
public function pcpay($order_id){
$m_order = Db::name("order");
$order_map['id'] = $order_id;
$order_data = $m_order->where($order_map)->find();
Vendor('sdk.aop.AopClient');
Vendor('sdk.aop.request.AlipayTradePagePayRequest');
$aop = new \AopClient ();
$aop->gatewayUrl = '/gateway.do';
$aop->appId = '******'; #appid
$aop->rsaPrivateKey = '******'; #开发者私钥
$aop->alipayrsaPublicKey='******'; #支付宝公钥
$aop->apiVersion = '1.0';
$aop->postCharset='UTF-8';
$aop->format='json';
$aop->signType='RSA2';
$request = new \AlipayTradePagePayRequest ();
$www_url = $_SERVER['HTTP_HOST'];
$data['body']='******'; #描述
$data['subject']='******'; #应用名
$data['out_trade_no']=$order_data['order']; #订单号
$data['timeout_express']='30m';
$data['total_amount']=$order_data['money']; #金额
$data['product_code']='FAST_INSTANT_TRADE_PAY';
#$data['qr_pay_mode']='3'; #PC扫码支付的方式,支持前置模式和跳转模式。
$bizcontent = json_encode($data);
$request->setNotifyUrl("http://".$www_url.".******"); #异步回调地址
$request->setReturnUrl("http://".$www_url); #同步回调地址,如果是前置模式,那么就需要自己写个判断订单状态的方法,让前端循环调取,前端自己做跳转
$request->setBizContent($bizcontent);
$result = $aop->pageExecute ( $request);
#$this->success("请求成功",$result);
echo $result;
}
值得注意的是qr_pay_mode属性,在前端使用iframe标签套住支付宝返回的代码,可以自定义自己支付页面的样式。
二、手机网站支付
public function webapp($order_id){
$m_order = Db::name("order");
$order_map['id'] = $order_id;
$order_data = $m_order->where($order_map)->find();
Vendor('sdk.aop.AopClient');
Vendor('sdk.aop.request.AlipayTradeWapPayRequest');
$aop = new \AopClient ();
$aop->gatewayUrl = '/gateway.do';
$aop->appId = '******'; #appid
$aop->rsaPrivateKey = '******'; #开发者私钥
$aop->alipayrsaPublicKey='******'; #支付宝公钥
$aop->apiVersion = '1.0';
$aop->postCharset='UTF-8';
$aop->format='json';
$aop->signType='RSA2';
$request = new \AlipayTradeWapPayRequest ();
$www_url = $_SERVER['HTTP_HOST'];
$data['body']='******'; #描述
$data['subject']='******'; #应用名
$data['out_trade_no']=$order_data['order']; #订单号
$data['timeout_express']='30m';
$data['total_amount']=$order_data['money']; #金额
$data['product_code']='QUICK_WAP_WAY';
$bizcontent = json_encode($data);
$request->setNotifyUrl("http://".$www_url."*****"); #异步回调地址
$request->setReturnUrl("http://".$www_url); #同步回调回调地址
$request->setBizContent($bizcontent);
$result = $aop->pageExecute ( $request);
#$this->success("请求成功",$result);
echo $result;
}
三、app支付
public function aoppay($order_id){
Vendor('sdk.aop.AopClient');
Vendor('sdk.aop.request.AlipayTradeAppPayRequest');
$aop = new \AopClient();
$m_order = Db::name("order");
$order_map['id'] = $order_id;
$order_data = $m_order->where($order_map)->find();
$aop->gatewayUrl = "/gateway.do";
$aop->appId = '******'; #appid
$aop->rsaPrivateKey = '******';//开发者私钥
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = '******';//支付宝公钥
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
//$this->ajaxReturn($aop);
$request = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$data['body']='******'; #描述
$data['subject']='******'; #应用名
$data['out_trade_no']=$order_data['order']; #订单号
$data['timeout_express']='30m';
$data['total_amount']=$order_data['money']; #金额
$data['product_code']='QUICK_MSECURITY_PAY';
$bizcontent = json_encode($data);
$www_url = $_SERVER['HTTP_HOST'];
//$this->ajaxReturn($bizcontent);
$request->setNotifyUrl("http://".$www_url."****"); #回调地址
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
// echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
// $res= htmlspecialchars($response);
//$res= htmlspecialchars_decode($response);
$this->success("请求成功",$response);
}
四、支付宝转账
Vendor('sdk.aop.AopClient');
Vendor('sdk.aop.request.AlipayFundTransToaccountTransferRequest');
$order = date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); //订单号
$aop = new \AopClient ();
$aop->gatewayUrl = '/gateway.do';
$aop->appId = '这里是应用appid';
$aop->rsaPrivateKey = '开发者私钥';
//转帐的是使用支付宝公钥的验签,默认使用的是初始化客户端时候的公钥,需要把初始化客户端的公钥修改为支付宝的公钥。应用公钥实际没有用处。
//$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='UTF-8';
$aop->format='json';
$request = new \AlipayFundTransToaccountTransferRequest ();
$data['out_biz_no']=$order; #订单号
$data['payee_type']='ALIPAY_LOGONID';
$data['payee_account']='******'; #这里是支付宝账号
$data['payee_real_name']='******'; #这里是真实姓名
$data['remark']='******'; #注释
$data['amount']='******'; #金额,最低0.1
$request->setBizContent($data);
$result = $aop->execute ($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
#$msg = $result->$responseNode->msg;
if(!empty($resultCode)&&$resultCode == 10000){
echo "转账成功!";
} else {
echo "转账失败!";
}
支付成功回调
header("Content-Type: text/html;charset=utf-8");
$request = Request::instance();
Vendor('sdk.AopSdk');
Vendor('sdk.aop.AopClient');
$aop = new \AopClient;
$aop->alipayrsaPublicKey = '******************'; #支付宝公钥,这里注意,一定是支付宝公钥,不是应用公钥
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
/*
#将上边一行验签代码注释,以下代码可以帮助自己检查验签错误
if($request->IsPost()){
$str = json_encode($_POST);
$fp = fopen("./pay.txt",'w');
fwrite($fp,$str);
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
$fp = fopen("./pay1.txt",'w');
fwrite($fp,$flag);
}else{
$filename = "./pay.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize ($filename));
$json_array = json_decode($contents,TRUE);
$flag = $aop->rsaCheckV1($json_array, NULL, "RSA2");
dump($json_array);
dump($flag);
die;
}*/
#验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
/**
* 验签通过后通过trade_status验证订单是否成功,通过out_trade_no获取订单号
* 修改订单表,以及执行自己的逻辑
**/
if (!empty($flag)) {
if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') { //处理交易完成或者支付成功的通知
$data['out_trade_no'] = $_POST['out_trade_no'];
#$data['out_trade_no'] = '202955504899';
$m_order = Db::name('order');
#查询订单状态是否完成,完成则应答支付宝,未完成则修改订单状态,执行自己的支付成功逻辑
$order_map['order'] = $data['out_trade_no'];
$order_map['status'] = 2;
$order_data = $m_order->where($order_map)->find();
if(empty($order_data)){
echo 'success';exit();
}
#修改订单状态,成功后逻辑在这里写
}
//打印success,应答支付宝。必须保证本界面无错误。只打印了success,否则支付宝将重复请求该回调地址。
echo 'success';
}
echo 'success';
如果觉得《支付宝扫码验签实例php PHP 支付宝支付 支付宝回调》对你有帮助,请点赞、收藏,并留下你的观点哦!