引入支付宝接口

放入一个插件库中,方便管理
创建支付类
1.发起支付
public function init() {
$order_id = $_REQUEST['order_id'];
$order_info = $this->order_db->get_one(array('id'=>$order_id));
$product_info = $this->product_db->get_one(array('id'=>$order_info['product_id']));
require_once("./phpcms/plugin/alipay/alipay.config.php");
require_once("./phpcms/plugin/alipay/lib/alipay_submit.class.php");
$out_trade_no = $order_info['orderno'];
$subject = '预订'.$product_info['name'].'订单';
$total_fee = $order_info['payprice'];
$body = $product_info['name'];
$parameter = array(
"service" => $alipay_config['service'],
"partner" => $alipay_config['partner'],
"seller_id" => $alipay_config['seller_id'],
"payment_type" => $alipay_config['payment_type'],
"notify_url" => $alipay_config['notify_url'],
"return_url" => $alipay_config['return_url'],
"anti_phishing_key"=>$alipay_config['anti_phishing_key'],
"exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
echo $html_text;
}
2.处理支付后的动作,比如更改订单状态为支付,跳转到支付成功页面等等
a.处理同步通知
public function return_url() {
$this->ilog_db->addLog('return_url');
require_once("./phpcms/plugin/alipay/alipay.config.php");
require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
$out_trade_no = $_GET['out_trade_no'];
$trade_no = $_GET['trade_no'];
$trade_status = $_GET['trade_status'];
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
}
else {
echo "trade_status=".$_GET['trade_status'];
}
$this->_afterPay($out_trade_no);
}
else {
echo "验证失败";
}
}
b.处理异步通知
public function notify_url() {
$this->ilog_db->addLog('notify_url');
require_once("./phpcms/plugin/alipay/alipay.config.php");
require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
$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') {
}
$this->_afterPay($out_trade_no);
}
else {
echo "fail";
}
}
c.处理成功后的订单数据处理与成功提示
private function _afterPay($orderno) {
$order_info = $this->order_db->get_one(array('orderno'=>$orderno));
if ($order_info['pay_status'] != '1') {
$data['pay_status'] = '1';
$data['pay_type'] = 'alipay';
$data['pay_code'] = '';
$data['paytime'] = time();
$data['order_status']= 3;
$r = $this->order_db->update($data,array('orderno'=>$orderno));
if ($r !== FALSE)
{
header("Location:?m=home&c=order&a=payDone&orderno=".$orderno);
} else {
showmessage('系统异常','blank');
}
} else {
header("Location:?m=home&c=order&a=payDone&orderno=".$orderno);
}
}
支付配置
<?php
$alipay_config['partner'] = '2088221883850827';
$alipay_config['seller_id'] = $alipay_config['partner'];
$alipay_config['key'] = '4t3m3qnwiq4lzqvv66sfu2vy9r3skkcn';
$alipay_config['notify_url'] = "http://local.duanzu.com/?m=ipay&c=alipay&a=notify_url";
$alipay_config['return_url'] = "http://local.duanzu.com/?m=ipay&c=alipay&a=return_url";
$alipay_config['sign_type'] = strtoupper('MD5');
$alipay_config['input_charset']= strtolower('utf-8');
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
$alipay_config['transport'] = 'http';
$alipay_config['payment_type'] = "1";
$alipay_config['service'] = "create_direct_pay_by_user";
$alipay_config['anti_phishing_key'] = "";
$alipay_config['exter_invoke_ip'] = "";
↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
?>
遇到的问题
支付成功后,通知提示验证失败,后来发现是因为 http://local.duanzu.com/?m=ipay&c=alipay&a=notify_url 地址中含有多余参数会导致签名失败。
找到这个方法,把多余的参数过滤掉就ok了。
function paraFilter($para) {
$para_filter = array();
while (list ($key, $val) = each ($para)) {
if($key == "sign" || $key == "sign_type" || $val == "" || $key == "m" || $key == "c" || $key == "a")continue;
else $para_filter[$key] = $para[$key];
}
return $para_filter;
}





本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5846207.html如需转载请自行联系原作者