You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
9.5 KiB
304 lines
9.5 KiB
|
3 years ago
|
<?php
|
||
|
|
defined('BASE_PATH') OR exit('No direct script access allowed');
|
||
|
|
|
||
|
|
class dalianpay
|
||
|
|
{
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 调用支付
|
||
|
|
*/
|
||
|
|
public function pay()
|
||
|
|
{
|
||
|
|
// 统一支付接口Demo
|
||
|
|
|
||
|
|
// 加载基础类
|
||
|
|
require_once('./library/Base.php');
|
||
|
|
$Base = new Base();
|
||
|
|
|
||
|
|
// 获取配置信息
|
||
|
|
$config = $Base->getConfig();
|
||
|
|
// var_dump('<pre>', $config);
|
||
|
|
|
||
|
|
// 接口URL(测试)
|
||
|
|
$api_url = $config['pay_url'];
|
||
|
|
|
||
|
|
// 加个body字段传中文试试
|
||
|
|
|
||
|
|
// 组装交易报文
|
||
|
|
$reqsn_prefix = date('Ymd');
|
||
|
|
// var_dump("uniq_id(reqsn)");
|
||
|
|
// echo "\r\n";
|
||
|
|
// var_dump(uniqid($reqsn_prefix));
|
||
|
|
$trade_data = array(
|
||
|
|
'orgid' => $config['org_num'],
|
||
|
|
'cusid' => $config['cusid'],
|
||
|
|
'branchno' => $config['branchno'],
|
||
|
|
'termcode' => $config['termcode'],
|
||
|
|
'version' => $config['version'],
|
||
|
|
'trxamt' => '1',
|
||
|
|
'reqsn' => uniqid($reqsn_prefix),
|
||
|
|
'producp' => 'JX0002',
|
||
|
|
'transtype' => 'JSP511',
|
||
|
|
'paytype' => 'W01',
|
||
|
|
'randomstr' => md5( uniqid() ),
|
||
|
|
'body' => 'pages'
|
||
|
|
);
|
||
|
|
|
||
|
|
// 生成签名
|
||
|
|
$sign = $Base->Crypt->makeSign($trade_data);
|
||
|
|
if($sign === false)
|
||
|
|
{
|
||
|
|
echo $Base->Crypt->err_msg;
|
||
|
|
die();
|
||
|
|
}
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[sign]: {$sign}";
|
||
|
|
// die();
|
||
|
|
|
||
|
|
// 加密交易报文
|
||
|
|
$crypted_trade_data = $Base->Crypt->encryptTradeData($trade_data);
|
||
|
|
if($crypted_trade_data === false)
|
||
|
|
{
|
||
|
|
echo $Base->Crypt->err_msg;
|
||
|
|
die();
|
||
|
|
}
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[crypted message]: {$crypted_trade_data}";
|
||
|
|
// die();
|
||
|
|
|
||
|
|
// 发送报文
|
||
|
|
// echo "\r\n";
|
||
|
|
// var_dump($api_url);
|
||
|
|
$response = $Base->Request->send($api_url, $crypted_trade_data, $sign);
|
||
|
|
if($response === false)
|
||
|
|
{
|
||
|
|
echo $Base->Request->err_msg;
|
||
|
|
die();
|
||
|
|
}
|
||
|
|
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[response message]: {$response}";
|
||
|
|
|
||
|
|
// 解析响应报文
|
||
|
|
$response = json_decode($response, true);
|
||
|
|
$response_data_crypted = $response['data'];
|
||
|
|
$response_sign = $response['sign'];
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[response sign]: {$response_sign}";
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[response data (ciphertext)]: {$response_data_crypted}";
|
||
|
|
|
||
|
|
// 解密响应密文
|
||
|
|
$response_data = $Base->Crypt->decryptTradeData($response_data_crypted);
|
||
|
|
if($response_data === false)
|
||
|
|
{
|
||
|
|
echo $Base->Crypt->err_msg;
|
||
|
|
die();
|
||
|
|
}
|
||
|
|
// echo "\r\n";
|
||
|
|
// echo "[response data(clear text)]: {$response_data}";
|
||
|
|
// die();
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 生成支付代码
|
||
|
|
* @param array $order 订单信息
|
||
|
|
* @param array $payment 支付方式信息
|
||
|
|
*/
|
||
|
|
public function get_code($order, $payment)
|
||
|
|
{
|
||
|
|
if (! defined('CHARSET')) {
|
||
|
|
$charset = 'utf-8';
|
||
|
|
} else {
|
||
|
|
$charset = CHARSET;
|
||
|
|
}
|
||
|
|
include_once(BASE_PATH.'helpers/payment_helper.php');
|
||
|
|
// $gateway = 'http://wappaygw.alipay.com/service/rest.htm?';
|
||
|
|
// // 请求业务数据
|
||
|
|
// $req_data = '<direct_trade_create_req>' .
|
||
|
|
// '<subject>' . $order['order_sn'] . '</subject>' .
|
||
|
|
// '<out_trade_no>' . $order['order_sn'] . 'O' . $order['log_id'] . '</out_trade_no>' .
|
||
|
|
// '<total_fee>' . $order['order_amount'] . '</total_fee>' .
|
||
|
|
// '<seller_account_name>' . $payment['alipay_account'] . '</seller_account_name>' .
|
||
|
|
// '<call_back_url>' . return_url(basename(__FILE__, '.php')) . '</call_back_url>' .
|
||
|
|
// '<notify_url>' . __URL__.'alipay.php' . '</notify_url>' .
|
||
|
|
// '<out_user>' . $order['consignee'] . '</out_user>' .
|
||
|
|
// '<merchant_url>'.__URL__.'</merchant_url>' .
|
||
|
|
// '<pay_expire>3600</pay_expire>' .
|
||
|
|
// '</direct_trade_create_req>';
|
||
|
|
|
||
|
|
$parameter = array(
|
||
|
|
'service' => 'alipay.wap.trade.create.direct', // 接口名称
|
||
|
|
'format' => 'xml', // 请求参数格式
|
||
|
|
'v' => '2.0', // 接口版本号
|
||
|
|
'partner' => $payment['alipay_partner'], // 合作者身份ID
|
||
|
|
'req_id' => $order['order_sn'] . $order['log_id'], // 请求号,唯一
|
||
|
|
'sec_id' => 'MD5', // 签名方式
|
||
|
|
'req_data' => $req_data, // 请求业务数据
|
||
|
|
"_input_charset" => $charset
|
||
|
|
);
|
||
|
|
|
||
|
|
ksort($parameter);
|
||
|
|
reset($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['alipay_key'];
|
||
|
|
|
||
|
|
// 请求授权接口
|
||
|
|
$result = \libraries\Http::doPost($gateway, $param . '&sign=' . md5($sign));
|
||
|
|
$result = urldecode($result); // URL转码
|
||
|
|
$result_array = explode('&', $result); // 根据 & 符号拆分
|
||
|
|
|
||
|
|
// 重构数组
|
||
|
|
$new_result_array = $temp_item = array();
|
||
|
|
if (is_array($result_array)) {
|
||
|
|
foreach ($result_array as $vo) {
|
||
|
|
$temp_item = explode('=', $vo, 2); // 根据 & 符号拆分
|
||
|
|
$new_result_array[$temp_item[0]] = $temp_item[1];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$xml = simplexml_load_string($new_result_array['res_data']);
|
||
|
|
$request_token = (array) $xml->request_token;
|
||
|
|
|
||
|
|
// 请求交易接口
|
||
|
|
$parameter = array(
|
||
|
|
'service' => 'alipay.wap.auth.authAndExecute', // 接口名称
|
||
|
|
'format' => 'xml', // 请求参数格式
|
||
|
|
'v' => $new_result_array['v'], // 接口版本号
|
||
|
|
'partner' => $new_result_array['partner'], // 合作者身份ID
|
||
|
|
'sec_id' => $new_result_array['sec_id'],
|
||
|
|
'req_data' => '<auth_and_execute_req><request_token>' . $request_token[0] . '</request_token></auth_and_execute_req>',
|
||
|
|
'request_token' => $request_token[0],
|
||
|
|
'_input_charset' => $charset
|
||
|
|
);
|
||
|
|
|
||
|
|
ksort($parameter);
|
||
|
|
reset($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['alipay_key'];
|
||
|
|
|
||
|
|
/* 生成支付按钮 */
|
||
|
|
$button = '<script type="text/javascript" src="data/assets/script/ap.js"></script><a type="button" class="box-flex btn-submit" onclick="javascript:_AP.pay(\'' . $gateway . $param . '&sign=' . md5($sign) . '\')">微信大连支付</a>';
|
||
|
|
|
||
|
|
return $button;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 同步通知
|
||
|
|
* @param $data
|
||
|
|
* @return mixed
|
||
|
|
*/
|
||
|
|
public function callback($data)
|
||
|
|
{
|
||
|
|
if (! empty($_GET)) {
|
||
|
|
include_once(BASE_PATH.'helpers/payment_helper.php');
|
||
|
|
$out_trade_no = explode('O', $_GET['out_trade_no']);
|
||
|
|
$log_id = $out_trade_no[1];
|
||
|
|
$payment = get_payment($data['code']);
|
||
|
|
|
||
|
|
/* 检查数字签名是否正确 */
|
||
|
|
ksort($_GET);
|
||
|
|
reset($_GET);
|
||
|
|
|
||
|
|
$sign = '';
|
||
|
|
foreach ($_GET as $key => $val) {
|
||
|
|
if ($key != 'sign' && $key != 'sign_type' && $key != 'code') {
|
||
|
|
$sign .= "$key=$val&";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$sign = substr($sign, 0, - 1) . $payment['alipay_key'];
|
||
|
|
if (md5($sign) != $_GET['sign']) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($_GET['result'] == 'success') {
|
||
|
|
/* 改变订单状态 */
|
||
|
|
order_paid($log_id, 2);
|
||
|
|
return true;
|
||
|
|
} else {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}else{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 异步通知
|
||
|
|
* @param $data
|
||
|
|
* @return mixed
|
||
|
|
*/
|
||
|
|
public function notify($data)
|
||
|
|
{
|
||
|
|
if (! empty($_POST)) {
|
||
|
|
include_once(BASE_PATH.'helpers/payment_helper.php');
|
||
|
|
$payment = get_payment($data['code']);
|
||
|
|
// 支付宝系统通知待签名数据构造规则比较特殊,为固定顺序。
|
||
|
|
$parameter['service'] = $_POST['service'];
|
||
|
|
$parameter['v'] = $_POST['v'];
|
||
|
|
$parameter['sec_id'] = $_POST['sec_id'];
|
||
|
|
$parameter['notify_data'] = $_POST['notify_data'];
|
||
|
|
// 生成签名字符串
|
||
|
|
$sign = '';
|
||
|
|
foreach ($parameter as $key => $val) {
|
||
|
|
$sign .= "$key=$val&";
|
||
|
|
}
|
||
|
|
$sign = substr($sign, 0, - 1) . $payment['alipay_key'];
|
||
|
|
// 验证签名
|
||
|
|
if (md5($sign) != $_POST['sign']) {
|
||
|
|
exit("fail");
|
||
|
|
}
|
||
|
|
// 解析notify_data
|
||
|
|
$data = (array) simplexml_load_string($parameter['notify_data']);
|
||
|
|
// 交易状态
|
||
|
|
$trade_status = $data['trade_status'];
|
||
|
|
// 获取支付订单号log_id
|
||
|
|
$out_trade_no = explode('O', $data['out_trade_no']);
|
||
|
|
$log_id = $out_trade_no[1]; // 订单号log_id
|
||
|
|
if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
|
||
|
|
/* 改变订单状态 */
|
||
|
|
order_paid($log_id, 2);
|
||
|
|
/*if(method_exists('WechatController', 'do_oauth')){
|
||
|
|
//如果需要,微信通知
|
||
|
|
$order_id = model()->table('order_info')->field('order_id')->where(array('order_sn'=>$out_trade_no[0]))->one();
|
||
|
|
$order_url = U('user/order/detail', array('order_id'=>$order_id), true);
|
||
|
|
$order_url = urlencode(base64_encode($order_url));
|
||
|
|
//send_wechat_message('pay_remind', '', $out_trade_no[0].' 订单已支付', $order_url, $out_trade_no[0]);
|
||
|
|
}*/
|
||
|
|
exit("success");
|
||
|
|
} else {
|
||
|
|
exit("fail");
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
exit("fail");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 订单查询
|
||
|
|
* @return mixed
|
||
|
|
*/
|
||
|
|
public function query($order, $payment)
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
}
|