支付宝支付–aliPay(服务端配置)
最后更新于:2022-04-01 23:48:09
# alipay 服务器端
> 这里分享一下服务端配置alipay的过程
**核心文件下载地址:** http://pan.baidu.com/s/1qYS8uDm
新版的支付宝
进入支付宝中,点击签约管理
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/f716ad305ab6c47aafa285e16b7d6fdb_1423x762.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/120fb445fffa3246bb790ea9c2f58041_898x349.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/1cbf7f3387539d8ec54b935e22436c76_992x352.png)
## *这里配置公钥和私钥请参考客户端中的秘钥配置**
## **php端**
> 先将所需文件放到项目中,如图
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/21d88ce98376157593dca4ef48e91c47_544x895.png)
> 在config中配置需要的信息
**注:cacert 这一项必须引入,注意路径,全部的配置项都按图所示**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/8d09ebcb30d2965c0f40070ae178caf6_1840x716.png)
代码如下
~~~
$configs = array(
"EXTEND_PATH" => '.'.__ROOT__.'/extend/',
'alipay_config' =>array(
//商户的私钥,此处填写原始私钥去头去尾,RSA公私钥生成
'private_key'=>'',
//支付宝的公钥
'alipay_public_key'=>'',
'service'=>'mobile.securitypay.pay',//接口名称
'partner'=>'2088621673597664',
'input_charset'=>strtolower('UTF-8'),
'notify_url'=>'http://***/notify_url.php',
'payment_type'=>1,
'seller_id'=>'****.com',
'sign_type'=>strtoupper('RSA'),
'cacert'=>getcwd()."__ROOT__/extend/Alipay/cacert.pem",
'transport'=>'http',
),
);
return $configs;
~~~
> alipay中,需要将orderInfo的信息在服务器端拼接处理
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/1655561f6bfb394795249c1dd8891fbd_1461x267.png)
> 现在附上我在服务器端处理信息的代码--按需修改数据处理和字段名其余的地方不要动
~~~
/**
* 支付前调用
* 所有的数据都在服务端进行组合,最后返回给客户端一个处理后的字符串。
*/
function alipay_before(){
require_once C(EXTEND_PATH).'Alipay/alipaycore.php';
require_once C(EXTEND_PATH).'Alipay/alipayrsa.php';
$order_id = I('orderID');
if(!$order_id){
$arr['msg'] = '非法数据';
$this->output($arr);
exit;
}
$order_info = $this->payment_history_model->find($order_id);
switch($order_info['classification_id']){
case '1':
$subject = 'VIP咨询师';
break;
case '2':
$subject = '超级VIP咨询师';
break;
}
//建立请求
$out_trade_no = $order_info['order_number']; //订单号
$total_fee = $order_info['money']; //付款金额
$body = '成为会员'; //商品详情
$alipay_config = C('alipay_config');
//构造要请求的参数数组,无需改动
$parameter = array(
'partner'=>$alipay_config['partner'],//合作者身份ID
'seller_id'=>$alipay_config['seller_id'],
'out_trade_no'=>$out_trade_no,//商户网站唯一订单号
'subject'=>$subject,//商品名称
'body'=>$body,//商品详情
'total_fee'=>$total_fee,
'notify_url'=>$alipay_config['notify_url'],//服务器异步通知页面路径
'service'=>$alipay_config['service'],//接口名称
'payment_type'=>$alipay_config['payment_type'],//支付类型
'_input_charset'=>$alipay_config['input_charset'],//参数编码字符集
);
//将post接收到的数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。
$data = createLinkstring($parameter);
//将待签名字符串使用私钥签名,且做urlencode. 注意:请求到支付宝只需要做一次urlencode.
$rsa_sign = urlencode(rsaSign($data, $alipay_config['private_key']));
//把签名得到的sign和签名类型sign_type拼接在待签名字符串后面。
$data = $data.'&sign='.'"'.$rsa_sign.'"'.'&sign_type='.'"'.$alipay_config['sign_type'].'"';
//打印待签名字符串。工程目录下的log文件夹中的log.txt。
// logResult($data);
//返回给客户端,建议在客户端使用私钥对应的公钥做一次验签,保证不是他人传输。
$arr['orderInfo'] = $data;
$this->output($arr);
}
~~~
> 将拼接的信息用户客户端app测试看是否成功
* * * * *
**注:回调地址不可以写mvc格式 必须是 下图 而且必须是外网地址。**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/6e567dded7d0f26956343b0c8da5920f_547x37.png)
> 要使用支付宝公钥,不要弄成应用公钥
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/6b448a6465b0917b03af242f7bad70d8_1271x121.png)
> 回调文件
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/1d817725696c73c69e1bd0c4ff7ec86c_361x659.png)
代码如下
> 验证回调的时候,推荐使用php中的log类 打印日志,在失败的时候方便查找问题,我在这里卡了很久
**下图中的核心文件请到支付宝下载sdk**
![](image/screenshot_1492504810951.png)
**回调文件代码**
~~~
alipayrsaPublicKey = '****支付宝公钥****';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA");
if($flag){
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
$pdo = new PDO("mysql:host=***数据库地址***;dbname=***数据库名称**","root","**密码**");
$sql="update lt_payment_history set payorder=$trade_no where order_number = $out_trade_no";
date_default_timezone_set("PRC");
$fp = fopen("../../data/runtime/Logs/ccc.txt","a");
flock($fp, LOCK_EX) ;
fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$sql."\n");
flock($fp, LOCK_UN);
fclose($fp);
$res=$pdo->exec($sql);
}
echo "success"; //请不要修改或删除
} else {
date_default_timezone_set("PRC");
$fp = fopen("../../data/runtime/Logs/bbb.txt","a");
flock($fp, LOCK_EX) ;
fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".'失败'."\n");
flock($fp, LOCK_UN);
fclose($fp);
echo "sign fail";
}
?>
~~~
';