文档地址:https://global.alipay.com/service/app_cn/1
1.配置文件,本地生成公钥私钥对,把本地的公钥提交给支付宝,换取支付宝公钥,私钥保留本地
2.拼接参数字段,调用签名方法进行签名,拼接完整支付链接接口
order_model = D("Common/Order");
}
// 积分主页
public function index() {
$return = array();
$oid = sp_checkparam("oid", true, 'int', "缺少订单号");
$info = $this->order_model
->where("id='{$oid}'")
->find();
if (!$info) {
sp_error("获取失败");
}
$prolist = sp_projson($info['projson']);
$array_query = array();
$array_query['service'] = "\"mobile.securitypay.pay\"";
$array_query['partner'] = "\"2088721528654455\"";
$array_query['_input_charset'] = "\"utf-8\"";
$array_query['notify_url'] = "\"http://".$_SERVER['HTTP_HOST']."/zfb/notify_url.php\"";
$array_query['out_trade_no'] = "\"".$info['sn']."\"";
$array_query['subject'] = "\"".$prolist[0]['product_name']."\"";
$array_query['payment_type'] = "\"1\"";
$array_query['seller_id'] = "\"[email protected]\"";
$array_query['total_fee'] = "\"".$info['total']."\"";
$array_query['currency'] = "\"AUD\"";
$array_query['body'] = "\"".$prolist[0]['product_name']."\"";
$array_query['forex_biz'] = "\"FP\"";
$array_query['it_b_pay'] = "\"30m\"";
$url = "http://aus.palmtrends.com/zfb/signatures_url.php";
$sign = sp_file_get_contents_safe($url,$array_query,'POST');
sp_api($sign);
}
}
3.支付链接拼接
4.签名方法rsa
/**
* RSA签名
* @param $data 待签名数据
* @param $private_key 商户私钥字符串
* return 签名结果
*/
function rsaSign($data, $private_key) {
//以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
//$private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);
//$private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);
//$private_key=str_replace("\n","",$private_key);
//$private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";
$res=openssl_get_privatekey($private_key);
if($res)
{
openssl_sign($data, $sign,$res);
}
else {
echo "您的私钥格式不正确!"."
"."The format of your private_key is incorrect!";
exit();
}
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
return $sign;
}
5.回调函数验证签名,处理数据
getResponse($_POST['notify_id'])) {//判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
if ($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {//使用支付宝公钥验签
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if ($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
$time = time();
$sql = "update cmf_order set payway=1,zfb_trade_no='{$trade_no}',status=1,paytime='{$time}' where sn='{$out_trade_no}'";
$res = mysql_query($sql,$conn);
$has = "select id from cmf_order_zfb where out_trade_no='{$_POST['out_trade_no']}'";
$r = mysql_query($has,$conn);
$has_res = mysql_fetch_array($r);
if (!$has_res) {
//插入记录表
$ins = array();
$ins['notify_type'] = $_POST['notify_type'];
$ins['trade_no'] = $_POST['trade_no'];
$ins['total_fee'] = $_POST['total_fee'];
$ins['out_trade_no'] = $_POST['out_trade_no'];
$ins['currency'] = $_POST['currency'];
$ins['sign_type'] = $_POST['sign_type'];
$ins['addtime'] = time();
$ins['notify_time'] = $_POST['notify_time'];
$sql_ins = "insert into cmf_order_zfb (notify_type,trade_no,total_fee,out_trade_no,currency,sign_type,addtime,notify_time) values('{$ins['notify_type']}','{$ins['trade_no']}','{$ins['total_fee']}','{$ins['out_trade_no']}','{$ins['currency']}','{$ins['sign_type']}','{$ins['addtime']}','{$ins['notify_time']}')";
mysql_query($sql_ins,$conn);
}
} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
$time = time();
$sql = "update cmf_order set payway=1,zfb_trade_no='{$trade_no}',status=1,paytime='{$time}' where sn='{$out_trade_no}'";
$res = mysql_query($sql,$conn);
$has = "select id from cmf_order_zfb where out_trade_no='{$_POST['out_trade_no']}'";
$r = mysql_query($has,$conn);
$has_res = mysql_fetch_array($r);
if (!$has_res) {
//插入记录表
$ins = array();
$ins['notify_type'] = $_POST['notify_type'];
$ins['trade_no'] = $_POST['trade_no'];
$ins['total_fee'] = $_POST['total_fee'];
$ins['out_trade_no'] = $_POST['out_trade_no'];
$ins['currency'] = $_POST['currency'];
$ins['sign_type'] = $_POST['sign_type'];
$ins['addtime'] = time();
$ins['notify_time'] = $_POST['notify_time'];
$sql_ins = "insert into cmf_order_zfb (notify_type,trade_no,total_fee,out_trade_no,currency,sign_type,addtime,notify_time) values('{$ins['notify_type']}','{$ins['trade_no']}','{$ins['total_fee']}','{$ins['out_trade_no']}','{$ins['currency']}','{$ins['sign_type']}','{$ins['addtime']}','{$ins['notify_time']}')";
mysql_query($sql_ins,$conn);
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
} else { //验证签名失败
echo "sign fail";
}
} else { //验证是否来自支付宝的通知失败
echo "response fail";
}
?>
6.验签函数
/**
* 获取返回时的签名验证结果
* @param $para_temp 通知返回来的参数数组
* @param $sign 返回的签名结果
* @return 签名验证结果
*/
function getSignVeryfy($para_temp, $sign) {
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
$isSgin = false;
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "RSA" :
$isSgin = rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign);
break;
default :
$isSgin = false;
}
return $isSgin;
}