pay alipay

feat/task1-c-wallet
gongfuxiang 2018-09-28 01:13:01 +08:00
parent dc9512ac1c
commit dff4e631f9
4 changed files with 208 additions and 18 deletions

View File

@ -40,12 +40,14 @@ class OrderController extends CommonController
{
$params = $_REQUEST;
$params['user'] = $this->user;
echo '<pre>';
$ret = OrderService::Pay($params);
print_r($ret);
if($ret['code'] == 0)
{
redirect($ret['data']);
} else {
$this->assign('msg', $ret['msg']);
$this->display('/Public/TipsError');
}
}
}
?>

View File

@ -13,7 +13,7 @@ namespace Library\Payment;
class Alipay
{
// 插件配置参数
private $params;
private $config;
/**
* 构造方法
@ -26,7 +26,7 @@ class Alipay
*/
public function __construct($params = [])
{
$this->params = $params;
$this->config = $params;
}
/**
@ -185,9 +185,197 @@ class Alipay
*/
public function Pay($params = [])
{
// 编写代码
if(IsMobile())
{
$ret = $this->PayMobile($params);
} else {
$ret = $this->PayWeb($params);
}
return $ret;
}
/**
* [SoonPayMobile wap手机支付]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:41:09+0800
* @param [array] $params [输入参数]
*/
private function PayMobile($params = [])
{
// 获取请求token
$ret = $this->GetRequestToken($params);
if($ret['code'] != 0)
{
return $ret;
}
// 拼接wap数据
$req_data = '<auth_and_execute_req><request_token>'.$ret['data'].'</request_token></auth_and_execute_req>';
$parameter = array(
'service' => 'alipay.wap.auth.authAndExecute',
'format' => 'xml',
'v' => '2.0',
'partner' => $this->config['key'],
'sec_id' => 'MD5',
'req_data' => $req_data,
'request_token' => $ret['data']
);
$param = $this->GetParamSign($parameter);
$url = 'http://wappaygw.alipay.com/service/rest.htm?'.$param['urlcode'].'&sign='.md5($param['sign']);
return DataReturn('处理成功', 0, $url);
}
/**
* [GetRequestToken 获取临时token]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:43:36+0800
* @param [array] $params [输入参数]
*/
private function GetRequestToken($params = [])
{
$parameter = array(
'service' => 'alipay.wap.trade.create.direct',
'format' => 'xml',
'v' => '2.0',
'partner' => $this->config['key'],
'req_id' => $params['order_sn'],
'sec_id' => 'MD5',
'req_data' => $this->GetReqData($params),
'subject' => $params['name'],
'out_trade_no' => $params['order_sn'],
'total_fee' => $params['total_price'],
'seller_account_name' => $this->config['account'],
'call_back_url' => $params['call_back_url'],
'notify_url' => $params['notify_url'],
'out_user' => $params['out_user'],
'merchant_url' => isset($params['merchant_url']) ? $params['merchant_url'] : $params['call_back_url'],
);
return 'Pay success';
$param = $this->GetParamSign($parameter);
$ret = urldecode(file_get_contents('http://wappaygw.alipay.com/service/rest.htm?'.$param['urlcode'].'&sign='.md5($param['sign'])));
// 把切割后的字符串数组变成变量与数值组合的数组
$para_split = explode('&',$ret);
$para_text = [];
foreach($para_split as $item)
{
//获得第一个=字符的位置
$npos = strpos($item, '=');
//获得字符串长度
$nlen = strlen($item);
//获得变量名
$key = substr($item, 0, $npos);
//获得数值
$value = substr($item, $npos+1, $nlen-$npos-1);
//放入数组中
$para_text[$key] = $value;
}
$req = Xml_Array($para_text['res_data']);
if(empty($req['request_token']))
{
return DataReturn('支付宝异常错误', -1);
}
return DataReturn('处理成功', 0, $req['request_token']);
}
/**
* [GetReqData 订单信息拼接]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:46:02+0800
* @param [array] $params [输入参数]
*/
private function GetReqData($params = [])
{
return '<direct_trade_create_req>
<subject>'.$params['name'].'</subject>
<out_trade_no>'.$params['order_sn'].'</out_trade_no>
<total_fee>'.$params['total_price'].'</total_fee>
<seller_account_name>'.$this->config['account'].'</seller_account_name>
<call_back_url>'.$params['call_back_url'].'</call_back_url>
<notify_url>'.$params['notify_url'].'</notify_url>
<out_user>'.$params['out_user'].'</out_user>
<merchant_url>'.$params['merchant_url'].'</merchant_url>
<pay_expire>3600</pay_expire>
<agent_id>0</agent_id>
</direct_trade_create_req>';
}
/**
* [PayWeb PC支付]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:23:04+0800
* @param [array] $params [输入参数]
*/
private function PayWeb($params = [])
{
$parameter = array(
'service' => 'create_direct_pay_by_user',
'partner' => $this->config['key'],
'_input_charset' => C('DEFAULT_CHARSET'),
'notify_url' => $params['notify_url'],
'return_url' => $params['call_back_url'],
/* 业务参数 */
'subject' => $params['name'],
'out_trade_no' => $params['order_sn'],
'price' => $params['total_price'],
'quantity' => 1,
'payment_type' => 1,
/* 物流参数 */
'logistics_type' => 'EXPRESS',
'logistics_fee' => 0,
'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
/* 买卖双方信息 */
'seller_email' => $this->config['account']
);
$param = $this->GetParamSign($parameter);
$url = 'https://mapi.alipay.com/gateway.do?'.$param['urlcode'].'&sign='.md5($param['sign']).'&sign_type=MD5';
return DataReturn('处理成功', 0, $url);
}
/**
* [GetParamSign 签名生成]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-28T00:28:07+0800
* @param [array] $params [输入参数]
*/
private function GetParamSign($params = [])
{
$urlcode = '';
$url = '';
ksort($params);
foreach($params AS $key => $val)
{
$urlcode .= "$key=" .urlencode($val). "&";
$url .= "$key=$val&";
}
$result = array(
'urlcode' => substr($urlcode, 0, -1),
'url' => substr($url, 0, -1),
);
if(!empty($this->config['partner']))
{
$result['sign'] = $result['url'].$this->config['partner'];
}
return $result;
}
/**

View File

@ -55,21 +55,21 @@ class OrderService
}
// 发起支付
$notify_url = __MY_URL__.'Notify/order.php';
$pay_data = array(
'out_user' => md5($params['user']['id']),
'order_sn' => date('YmdHis').$data['id'],
'name' => '订单支付',
'total_price' => $data['total_price'],
'notify_url' => $notify_url,
'out_user' => md5($params['user']['id']),
'order_sn' => date('YmdHis').$data['id'],
'name' => '订单支付',
'total_price' => $data['total_price'],
'notify_url' => __MY_URL__.'Notify/order.php',
'call_back_url' => __MY_URL__.'Respond/order.php',
);
$pay_name = '\Library\Payment\\'.$payment[0]['payment'];
$pay = (new $pay_name($payment[0]['config']))->Pay($pay_data);
if(empty($pay))
$ret = (new $pay_name($payment[0]['config']))->Pay($pay_data);
if(empty($ret))
{
return DataReturn('支付接口异常', -1);
}
return DataReturn(L('common_operation_success'), 0, $pay);
return $ret;
}
}
?>

View File