feat/task1-c-wallet
parent
51c964081f
commit
837250b735
|
|
@ -184,7 +184,7 @@ class UserController extends CommonController
|
|||
*/
|
||||
public function GetAlipayUserInfo()
|
||||
{
|
||||
$result = (new \Library\Alipay())->GetAlipayUserInfo(I('authcode'), MyC('common_app_mini_alipay_appid'));
|
||||
$result = (new \Library\AlipayAuth())->GetAlipayUserInfo(I('authcode'), MyC('common_app_mini_alipay_appid'));
|
||||
if($result === false)
|
||||
{
|
||||
$this->ajaxReturn('获取授权信息失败');
|
||||
|
|
|
|||
|
|
@ -3,211 +3,17 @@
|
|||
namespace Library;
|
||||
|
||||
/**
|
||||
* 支付宝支付驱动
|
||||
* 支付宝授权驱动
|
||||
* @author Devil
|
||||
* @version V_1.0.0
|
||||
*/
|
||||
class Alipay
|
||||
class AlipayAuth
|
||||
{
|
||||
/**
|
||||
* [__construct 构造方法]
|
||||
*/
|
||||
public function __construct(){}
|
||||
|
||||
/**
|
||||
* [SoonPay 立即支付]
|
||||
* @param [array] $data [支付信息]
|
||||
*/
|
||||
public function SoonPay($data, $config)
|
||||
{
|
||||
if(empty($data) || empty($config)) return false;
|
||||
|
||||
if(APPLICATION == 'app')
|
||||
{
|
||||
return $this->SoonPayApp($data, $config);
|
||||
} else {
|
||||
if(IsMobile())
|
||||
{
|
||||
$this->SoonPayMobile($data, $config);
|
||||
} else {
|
||||
$this->SoonPayWeb($data, $config);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [SoonPayApp app支付]
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @datetime 2017-10-25T16:07:06+0800
|
||||
* @param [array] $data [参数列表]
|
||||
* @param [array] $config [配置信息]
|
||||
*/
|
||||
private function SoonPayApp($data, $config)
|
||||
{
|
||||
$parameter = array(
|
||||
'app_id' => MyC('common_app_mini_alipay_appid'),
|
||||
'method' => 'alipay.trade.app.pay',
|
||||
'format' => 'JSON',
|
||||
'charset' => 'utf-8',
|
||||
'sign_type' => 'RSA2',
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'version' => '1.0',
|
||||
'notify_url' => $data['notify_url'],
|
||||
);
|
||||
$biz_content = array(
|
||||
'subject' => $data['name'],
|
||||
'out_trade_no' => $data['order_sn'],
|
||||
'total_amount' => $data['total_price'],
|
||||
'product_code' => 'QUICK_MSECURITY_PAY',
|
||||
);
|
||||
|
||||
// 收款账户集
|
||||
if(!empty($data['seller_id']))
|
||||
{
|
||||
$biz_content['seller_id'] = $data['seller_id'];
|
||||
}
|
||||
$parameter['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE);
|
||||
|
||||
|
||||
// 生成签名参数+签名
|
||||
$params = $this->GetParamSign($parameter);
|
||||
$params['param'] .= '&sign='.urlencode($this->MyRsaSign($params['value']));
|
||||
|
||||
// 直接返回支付信息
|
||||
return $params['param'];
|
||||
}
|
||||
|
||||
/**
|
||||
* [SoonPayMobile wap支付]
|
||||
* @param [array] $data [参数列表]
|
||||
* @param [array] $config [配置信息]
|
||||
*/
|
||||
private function SoonPayMobile($data, $config)
|
||||
{
|
||||
$request_token = $this->GetRequestToken($data, $config);
|
||||
|
||||
$req_data = '<auth_and_execute_req><request_token>'.$request_token.'</request_token></auth_and_execute_req>';
|
||||
$parameter = array(
|
||||
'service' => 'alipay.wap.auth.authAndExecute',
|
||||
'format' => 'xml',
|
||||
'v' => '2.0',
|
||||
'partner' => $config['id'],
|
||||
'sec_id' => 'MD5',
|
||||
'req_data' => $req_data,
|
||||
'request_token' => $request_token
|
||||
);
|
||||
|
||||
$param = $this->GetParamSign($parameter, $config);
|
||||
header('location:http://wappaygw.alipay.com/service/rest.htm?'.$param['param']. '&sign='.md5($param['sign']));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* [GetRequestToken 获取临时token]
|
||||
* @param [array] $data [参数列表]
|
||||
* @param [array] $config [配置信息]
|
||||
* @return [string] [返回临时token]
|
||||
*/
|
||||
private function GetRequestToken($data, $config)
|
||||
{
|
||||
$parameter = array(
|
||||
'service' => 'alipay.wap.trade.create.direct',
|
||||
'format' => 'xml',
|
||||
'v' => '2.0',
|
||||
'partner' => $config['id'],
|
||||
'req_id' => $data['order_sn'],
|
||||
'sec_id' => 'MD5',
|
||||
'req_data' => $this->GetReqData($data, $config),
|
||||
'subject' => $data['name'],
|
||||
'out_trade_no' => $data['order_sn'],
|
||||
'total_fee' => $data['total_price'],
|
||||
'seller_account_name' => $config['name'],
|
||||
'call_back_url' => $data['call_back_url'],
|
||||
'notify_url' => $data['notify_url'],
|
||||
'out_user' => $data['out_user'],
|
||||
'merchant_url' => $data['merchant_url'],
|
||||
);
|
||||
|
||||
$param = $this->GetParamSign($parameter, $config);
|
||||
$ret = urldecode(file_get_contents('http://wappaygw.alipay.com/service/rest.htm?'.$param['param'].'&sign='.md5($param['sign'])));
|
||||
|
||||
$para_split = explode('&',$ret);
|
||||
//把切割后的字符串数组变成变量与数值组合的数组
|
||||
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']))
|
||||
{
|
||||
exit(header('location:'.__ROOT__.'index.php?g=Info&c=Prompt&f=PromptInfo&state=error&content=支付宝异常错误&url='.__ROOT__));
|
||||
}
|
||||
|
||||
return $req['request_token'];
|
||||
}
|
||||
|
||||
private function GetReqData($data, $config)
|
||||
{
|
||||
return '<direct_trade_create_req>
|
||||
<subject>'.$data['name'].'</subject>
|
||||
<out_trade_no>'.$data['order_sn'].'</out_trade_no>
|
||||
<total_fee>'.$data['total_price'].'</total_fee>
|
||||
<seller_account_name>'.$config['name'].'</seller_account_name>
|
||||
<call_back_url>'.$data['call_back_url'].'</call_back_url>
|
||||
<notify_url>'.$data['notify_url'].'</notify_url>
|
||||
<out_user>'.$data['out_user'].'</out_user>
|
||||
<merchant_url>'.$data['merchant_url'].'</merchant_url>
|
||||
<pay_expire>3600</pay_expire>
|
||||
<agent_id>0</agent_id>
|
||||
</direct_trade_create_req>';
|
||||
}
|
||||
|
||||
/**
|
||||
* [SoonPayWeb web支付]
|
||||
* @param [array] $data [订单信息]
|
||||
* @param [array] $config [配置信息]
|
||||
*/
|
||||
private function SoonPayWeb($data, $config)
|
||||
{
|
||||
$parameter = array(
|
||||
'service' => 'create_direct_pay_by_user',
|
||||
'partner' => $config['id'],
|
||||
'_input_charset' => ML_CHARSET,
|
||||
'notify_url' => $data['notify_url'],
|
||||
'return_url' => $data['call_back_url'],
|
||||
|
||||
/* 业务参数 */
|
||||
'subject' => $data['name'],
|
||||
'out_trade_no' => $data['order_sn'],
|
||||
'price' => $data['total_price'],
|
||||
|
||||
'quantity' => 1,
|
||||
'payment_type' => 1,
|
||||
|
||||
/* 物流参数 */
|
||||
'logistics_type' => 'EXPRESS',
|
||||
'logistics_fee' => 0,
|
||||
'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
|
||||
|
||||
/* 买卖双方信息 */
|
||||
'seller_email' => $config['name']
|
||||
);
|
||||
|
||||
$param = $this->GetParamSign($parameter, $config);
|
||||
header('location:https://mapi.alipay.com/gateway.do?'.$param['param']. '&sign='.md5($param['sign']).'&sign_type=MD5');
|
||||
}
|
||||
|
||||
/**
|
||||
* [GetParamSign 生成参数和签名]
|
||||
* @param [array] $data [待生成的参数]
|
||||
|
|
@ -237,61 +43,6 @@ class Alipay
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* [Respond 异步处理]
|
||||
* @param [array] $config [配置信息]
|
||||
* @return [array|string] [成功返回数据列表,失败返回no]
|
||||
*/
|
||||
public function Respond($config)
|
||||
{
|
||||
if(empty($config)) return 'no';
|
||||
|
||||
$data = empty($_POST) ? $_GET : array_merge($_GET, $_POST);
|
||||
ksort($data);
|
||||
|
||||
$sign = '';
|
||||
if(isset($data['sec_id']) && $data['sec_id'] == 'MD5')
|
||||
{
|
||||
$data_xml = json_decode(json_encode((array) simplexml_load_string($data['notify_data'])), true);
|
||||
$data = array_merge($data, $data_xml);
|
||||
$sign = 'service='.$data['service'].'&v='.$data['v'].'&sec_id='.$data['sec_id'].'¬ify_data='.$data['notify_data'];
|
||||
} else {
|
||||
foreach($data AS $key=>$val)
|
||||
{
|
||||
if ($key != 'sign' && $key != 'sign_type' && $key != 'code')
|
||||
{
|
||||
$sign .= "$key=$val&";
|
||||
}
|
||||
}
|
||||
$sign = substr($sign, 0, -1);
|
||||
}
|
||||
|
||||
if(isset($data['sign_type']) && $data['sign_type'] == 'RSA2')
|
||||
{
|
||||
if(!$this->AlipayrsaVerify($sign, $data['sign']))
|
||||
{
|
||||
return 'no';
|
||||
}
|
||||
} else {
|
||||
if(!isset($data['sign']) || md5($sign.$config['key']) != $data['sign'])
|
||||
{
|
||||
return 'no';
|
||||
}
|
||||
}
|
||||
|
||||
/* 支付状态 */
|
||||
$status = isset($data['trade_status']) ? $data['trade_status'] : $data['result'];
|
||||
switch($status)
|
||||
{
|
||||
case 'TRADE_SUCCESS':
|
||||
case 'TRADE_FINISHED':
|
||||
case 'success':
|
||||
return $data;
|
||||
break;
|
||||
}
|
||||
return 'no';
|
||||
}
|
||||
|
||||
/**
|
||||
* [GetAlipayUserInfo 支付宝小程序获取用户信息]
|
||||
* @author Devil
|
||||
|
|
@ -581,9 +332,9 @@ class Alipay
|
|||
* @version 1.0.0
|
||||
* @datetime 2017-10-28T21:31:41+0800
|
||||
* @param [string] $query [生成小程序启动参数(如:type=page&page=shop&value=5)]
|
||||
* @param [string] $describe [二维码描述(默认:美啦网)]
|
||||
* @param [string] $describe [二维码描述(默认:ShopXO)]
|
||||
*/
|
||||
public function AlipayQrcodeCreate($query, $describe = '美啦网')
|
||||
public function AlipayQrcodeCreate($query, $describe = 'ShopXO')
|
||||
{
|
||||
// 请求参数
|
||||
$params = [
|
||||
|
|
@ -1,3 +1,25 @@
|
|||
+=========================================================+
|
||||
ShopXO 1.0.1 Release 20181111 http://shopxo.net
|
||||
+=========================================================+
|
||||
后台管理功能列表
|
||||
1、优化轮播图片与手机端分离
|
||||
2、新增问答/留言
|
||||
3、新增手机端管理
|
||||
4、新增支付宝小程序(轮播、首页导航)
|
||||
5、调整平台类别
|
||||
6、新增支付宝小程序支付插件
|
||||
7、优化部分BUG
|
||||
|
||||
前端功能列表
|
||||
1、购物流程优化(去掉用户选择快递)
|
||||
2、优化部分BUG
|
||||
|
||||
手机端
|
||||
1、新增支付宝小程序
|
||||
2、支持后台配置基础信息
|
||||
3、支持后台生成程序包
|
||||
|
||||
|
||||
+=========================================================+
|
||||
ShopXO 1.0.0 Release 20181111 http://shopxo.net
|
||||
+=========================================================+
|
||||
|
|
|
|||
Loading…
Reference in New Issue