1-1:首先下载支付宝官方SDK,我的是PHP版的,起名“alipay”
下载地址:https://docs.open.alipay.com/54/103419/
1-2:配置文件 config.php
// 支付宝
'ALIPAY_CONFIG' =>[
'app_id' =>'12345678', //app_id
// 支付宝私钥
'rsaPrivateKey' =>'ZS1FY8LDXd',
// 支付宝公钥
'alipayrsaPublicKey'=>'p/JhMWNiQIDAQAB',
'notify_url' =>'http://www.abc.com/public/api/portal/Order/notify_url.html',//回调地址(支付宝支付成功后回调修改订单状态的地址)
'payment_type' =>1,//(固定值)
'charset' => 'utf-8',//编码
'sign_type' => 'RSA2',//签名方式
'version' =>"1.0",//固定值
'url' => 'https://openapi.alipay.com/gateway.do',//固定值
'method' => 'alipay.trade.app.pay', //固定值
],
注:其中,支付宝公钥为这个
1-3:控制器
// 1-2 支付宝生成签名
public function ZfbSing()
{
if ($this->request->isGet()) {
// 引入支付宝第三方sdk类库
import('alipay.aop.AopClient', EXTEND_PATH);
// 调用支付宝配置文件
$API = config('ALIPAY_CONFIG');
//构造业务请求参数的集合(订单信息)
$content = array();
$content['subject'] = '商品标题'; // 商品标题
$content['body'] = '商品描述'; // 商品描述 非必须
$content['out_trade_no'] = '订单号'; // 订单号
$content['timeout_express'] = "15m"; // 允许最晚的支付时间 非必须
$content['total_amount'] = '15.00'; // 要求必须为浮点型,订单金额
$content['product_code'] = "QUICK_MSECURITY_PAY"; //销售产品码,固定值
$con = json_encode($content); //$content是biz_content的值,将之转化成json字符串
//公共参数
$Client = new \AopClient(); //实例化支付宝sdk里面的AopClient类,下单时需要的操作,都在这个类里面
$param = array();
$param['app_id'] = $API['app_id']; //支付宝分配给开发者的应用ID
$param['method'] = $API['method']; //接口名称
$param['charset'] = $API['charset']; //请求使用的编码格式
$param['sign_type'] = $API['sign_type']; //商户生成签名字符串所使用的签名算法类型
$param['timestamp'] = date("Y-m-d H:i:s"); //发送请求的时间
$param['version'] = $API['version']; //调用的接口版本,固定为:1.0
$param['notify_url'] = $API['notify_url']; //支付宝服务器主动通知地址
$param['biz_content'] = $con; //业务请求参数的集合,长度不限,json格式
$paramStr = $Client->getSignContent($param);//组装请求签名参数 到此步目前没有问题
$sign = $Client->alonersaSign($paramStr, $API['rsaPrivateKey'], 'RSA2'); //生成签名
$param['sign'] = $sign;
$str = $Client->getSignContentUrlencode($param); //最终请求参数
echo json_encode(['code' => 100, 'msg' => '成功', 'data' => ['sing' => $str]], JSON_UNESCAPED_UNICODE);
exit;
} else {
echo json_encode(['code' => 101, 'msg' => '请求类型错误'], JSON_UNESCAPED_UNICODE);
exit;
}
}
1-4:支付宝支付成功回调
// 支付宝支付异步回调
public function notify_url()
{
import('alipay.aop.AopClient', EXTEND_PATH); // 引入支付宝第三方类库
$API = config('ALIPAY_CONFIG'); // 调用支付宝配置文件
$Client = new \AopClient(); // 实例化类
$Client->alipayrsaPublicKey = $API['alipayrsaPublicKey'];
$parm = $_POST;
// 验证签名
$flag = $Client->rsaCheckV1($parm,NULL,"RSA2");
if($flag){
if ($parm['trade_status'] == 'TRADE_SUCCESS' || $parm['trade_status'] == 'TRADE_FINISHED') {
// 此处为自己业务逻缉处理
$OrderModel = new ServerOrderModel();
$condition['order_num'] = $parm['out_trade_no']; // 交易订单号
$data['pay_time'] = $parm['gmt_payment']; // 付款时间
$data['pay_type'] = 1; // 支付类型 1:支付宝 2:微信
$data['is_pay'] = 1; // 是否支付
$OrderModel->updateOrder($condition, $data);
echo 'success';
}
}
}
1-5:备注,回调方法中,$_POST数组如下:
{
"gmt_create":"2018-10-29 14:06:27",
"charset":"utf-8",
"seller_email":"[email protected]",
"subject":"索尼相机系列",
"sign":"NS+bPlvoAHfNIcf97mUmtkBcTaTB\/vMTyVp9R4QM+DM7wlr",
"body":"所选服务:索尼相机系列 x 1",
"buyer_id":"2088402609538780",
"invoice_amount":"0.01",
"notify_id":"2018102900222140628038781018476292",
"fund_bill_list":'[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]',
"notify_type":"trade_status_sync",
"trade_status":"TRADE_SUCCESS",
"receipt_amount":"0.01",
"app_id":"12345678",
"buyer_pay_amount":"0.01",
"sign_type":"RSA2",
"seller_id":"2088031469395781",
"gmt_payment":"2018-10-29 14:06:27",
"notify_time":"2018-10-29 14:06:28",
"version":"1.0",
"out_trade_no":"20181029140609758396",
"total_amount":"0.01",
"trade_no":"2018102922001438781005066681",
"auth_app_id":"2018030702332021",
"buyer_logon_id":"894***@qq.com",
"point_amount":"0.00"
}