失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 支付宝扫码验签实例php PHP 支付宝支付 支付宝回调

支付宝扫码验签实例php PHP 支付宝支付 支付宝回调

时间:2019-05-07 03:28:18

相关推荐

支付宝扫码验签实例php PHP 支付宝支付 支付宝回调

下载官方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 支付宝支付 支付宝回调》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。