paylinks.php_支付宝+银联统一支付功能实现

本文档展示了如何在PHP中实现支付宝和银联的统一支付功能。主要涉及配置模型、构造请求参数、生成支付链接以及支付回调通知的处理。在调试过程中要注意参数传递的准确性,例如money、deal_name、order_sn等。代码中包含了创建支付宝支付链接的函数alipay_link(),并有检查签名验证的逻辑。

出现调试错误一般是参数传错了

1、配置model里面的config,model里其他东西根本不用看

2、构造请求参数$payment

money、deal_name和订单号notice_sn是你随便给的,bank_id在页面用 radio传过来的其值是我给的那些银行ID,比如工行就是ICBCB2C

PaymentModel:正在连接支付接口...';

$payLinks.='';

return $payLinks;

}

// 支付宝链接

function alipay_link($form){

$payment_notice = array(

'money'=>$form['money'],

'deal_name'=>$form['order_name'],

'bank_id'=>$form['bank_id'],

'notice_sn'=>$form['order_sn'],

);

$money = round($payment_notice['money'],2);

$payment_info = $this->config;

$subject = $payment_notice['deal_name'];

$data_return_url = $payment_info['return_url'];

$data_notify_url = $payment_info['notify_url'];

$parameter = array(

'service' => 'create_direct_pay_by_user',

'partner' => $payment_info['alipay_partner'],

//'partner' => ALIPAY_ID,

'_input_charset' => 'utf-8',

'notify_url' => $data_notify_url,

'return_url' => $data_return_url,

/* 业务参数 */

'subject' => $subject,

'out_trade_no' => $payment_notice['notice_sn'],

'price' => $money,

'quantity' => 1,

'payment_type' => 1,

/* 物流参数 */

'logistics_type' => 'EXPRESS',

'logistics_fee' => 0,

'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',

'extend_param' => 'changjianghu',

/* 买卖双方信息 */

'seller_email' => $payment_info['alipay_account']

);

// print_r($parameter);exit;

$parameter = $this->argSort($parameter);

$param = '';

$sign = '';

foreach ($parameter AS $key => $val)

{

$param .= "$key=" .urlencode($val). "&";

$sign .= "$key=$val&";

}

$param = substr($param, 0, -1);

$sign = substr($sign, 0, -1). $payment_info['alipay_key'];

$sign_md5 = md5($sign);

$payLinks = '正在连接支付接口...';

$payLinks.='';

return $payLinks;

}

/*结果*/

function notify($request){

$return_res = array(

'info'=>'',

'status'=>false,

);

$payment = $this->config;

$request = $this->argSort($request);

/* 检查数字签名是否正确 */

$isSign = $this->getSignVeryfy($request);

if (!$isSign){//签名验证失败

$return_res['info'] = '签名验证失败';

return $return_res;

}

if ($request['trade_status'] == 'TRADE_SUCCESS' || $request['trade_status'] == 'TRADE_FINISHED' || $request['trade_status'] == 'WAIT_SELLER_SEND_GOODS' || $request['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS'){

$return_res['status'] = true;

}

return $return_res;

}

// 获取返回时的签名验证结果

function getSignVeryfy($para_temp) {

//除去待签名参数数组中的空值和签名参数

$para_filter = $this->paraFilter($para_temp);

//对待签名参数数组排序

$para_sort = $this->argSort($para_filter);

//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串

$prestr = $this->createLinkstring($para_sort);

$isSgin = false;

$isSgin = $this->md5Verify($prestr, $para_temp['sign'], $this->config['alipay_key']);

return $isSgin;

}

// 验证签名

function md5Verify($prestr, $sign, $key) {

$prestr = $prestr . $key;

$mysgin = md5($prestr);

if($mysgin == $sign) {

return true;

}

else {

return false;

}

}

// 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串

function createLinkstring($para) {

$arg = "";

while (list ($key, $val) = each ($para)) {

$arg.=$key."=".$val."&";

}

//去掉最后一个&字符

$arg = substr($arg,0,count($arg)-2);

//如果存在转义字符,那么去掉转义

if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}

return $arg;

}

// 除去数组中的空值和签名参数

function paraFilter($para) {

$para_filter = array();

while (list ($key, $val) = each ($para)) {

if($key == "sign" || $key == "sign_type" || $val == "")continue;

else $para_filter[$key] = $para[$key];

}

return $para_filter;

}

// 对数组排序

function argSort($para) {

ksort($para);

reset($para);

return $para;

}

}

?>HTML模板:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值