alipay 服务器端
这里分享一下服务端配置alipay的过程
核心文件下载地址: http://pan.baidu.com/s/1qYS8uDm
新版的支付宝
进入支付宝中,点击签约管理
这里配置公钥和私钥请参考客户端中的秘钥配置*
php端
先将所需文件放到项目中,如图
在config中配置需要的信息
注:cacert 这一项必须引入,注意路径,全部的配置项都按图所示
代码如下
$configs = array(
"EXTEND_PATH" => ".".."/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()."/extend/Alipay/cacert.pem",
"transport"=>"http",
),
);
return $configs;
alipay中,需要将orderInfo的信息在服务器端拼接处理
现在附上我在服务器端处理信息的代码--按需修改数据处理和字段名其余的地方不要动
/**
* 支付前调用
* 所有的数据都在服务端进行组合,最后返回给客户端一个处理后的字符串。
*/
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格式 必须是 下图 而且必须是外网地址。
要使用支付宝公钥,不要弄成应用公钥
回调文件
代码如下
验证回调的时候,推荐使用php中的log类 打印日志,在失败的时候方便查找问题,我在这里卡了很久
下图中的核心文件请到支付宝下载sdk
回调文件代码
<?php
/* *
* 功能:支付宝服务器异步通知页面
* 版本:1.0
* 日期:2016-06-06
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*************************页面功能说明*************************
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
* 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
*/
require_once("../../extend/Alipay/AopClient.php");
$aop = new AopClient;
$aop->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())."
".$sql."
");
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())."
"."失败"."
");
flock($fp, LOCK_UN);
fclose($fp);
echo "sign fail";
}
?>