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.
161 lines
6.7 KiB
161 lines
6.7 KiB
<?php
|
|
defined('IN_IA') or exit('Access Denied');
|
|
|
|
class PayBuild {
|
|
static function wechat_proxy_build($params, $wechat) {
|
|
global $_W;
|
|
$uniacid = !empty($wechat['service']) ? $wechat['service'] : $wechat['borrow'];
|
|
$oauth_account = uni_setting($uniacid, array('payment'));
|
|
if (intval($wechat['switch']) == '2') {
|
|
$_W['uniacid'] = $uniacid;
|
|
$wechat['signkey'] = $oauth_account['payment']['wechat']['signkey'];
|
|
$wechat['mchid'] = $oauth_account['payment']['wechat']['mchid'];
|
|
unset($wechat['sub_mch_id']);
|
|
} else {
|
|
$wechat['signkey'] = $oauth_account['payment']['wechat_facilitator']['signkey'];
|
|
$wechat['mchid'] = $oauth_account['payment']['wechat_facilitator']['mchid'];
|
|
}
|
|
$acid = pdo_getcolumn('uni_account', array('uniacid' => $uniacid), 'default_acid');
|
|
$wechat['appid'] = pdo_getcolumn('account_wechats', array('acid' => $acid), 'key');
|
|
$wechat['version'] = 2;
|
|
return wechat_build($params, $wechat);
|
|
}
|
|
|
|
static function wechat_build($params, $wechat) {
|
|
global $_W;
|
|
load()->func('communication');
|
|
if (empty($wechat['version']) && !empty($wechat['signkey'])) {
|
|
$wechat['version'] = 1;
|
|
}
|
|
$wOpt = array();
|
|
if ($wechat['version'] == 1) {
|
|
$wOpt['appId'] = $wechat['appid'];
|
|
$wOpt['timeStamp'] = strval(TIMESTAMP);
|
|
$wOpt['nonceStr'] = random(8);
|
|
$package = array();
|
|
$package['bank_type'] = 'WX';
|
|
$package['body'] = $params['title'];
|
|
$package['attach'] = $_W['uniacid'];
|
|
$package['partner'] = $wechat['partner'];
|
|
$package['out_trade_no'] = $params['uniontid'];
|
|
$package['total_fee'] = $params['fee'] * 100;
|
|
$package['fee_type'] = '1';
|
|
$package['notify_url'] = MODULE_URL . 'payment/wechat/weixin_notify.php';
|
|
$package['spbill_create_ip'] = CLIENT_IP;
|
|
$package['time_start'] = date('YmdHis', TIMESTAMP);
|
|
$package['time_expire'] = date('YmdHis', TIMESTAMP + 600);
|
|
$package['input_charset'] = 'UTF-8';
|
|
if (!empty($wechat['sub_appid'])) {
|
|
$package['sub_appid'] = $wechat['sub_appid'];
|
|
}
|
|
if (!empty($wechat['sub_mch_id'])) {
|
|
$package['sub_mch_id'] = $wechat['sub_mch_id'];
|
|
}
|
|
ksort($package);
|
|
$string1 = '';
|
|
foreach ($package as $key => $v) {
|
|
if (empty($v)) {
|
|
continue;
|
|
}
|
|
$string1 .= "{$key}={$v}&";
|
|
}
|
|
$string1 .= "key={$wechat['key']}";
|
|
$sign = strtoupper(md5($string1));
|
|
|
|
$string2 = '';
|
|
foreach ($package as $key => $v) {
|
|
$v = urlencode($v);
|
|
$string2 .= "{$key}={$v}&";
|
|
}
|
|
$string2 .= "sign={$sign}";
|
|
$wOpt['package'] = $string2;
|
|
|
|
$string = '';
|
|
$keys = array('appId', 'timeStamp', 'nonceStr', 'package', 'appKey');
|
|
sort($keys);
|
|
foreach ($keys as $key) {
|
|
$v = $wOpt[$key];
|
|
if ($key == 'appKey') {
|
|
$v = $wechat['signkey'];
|
|
}
|
|
$key = strtolower($key);
|
|
$string .= "{$key}={$v}&";
|
|
}
|
|
$string = rtrim($string, '&');
|
|
$wOpt['signType'] = 'SHA1';
|
|
$wOpt['paySign'] = sha1($string);
|
|
return $wOpt;
|
|
} else {
|
|
$package = array();
|
|
$package['appid'] = $wechat['appid'];
|
|
$package['mch_id'] = $wechat['mchid'];
|
|
$package['nonce_str'] = random(8);
|
|
$package['body'] = cutstr($params['title'], 26);
|
|
$package['attach'] = $_W['uniacid'];
|
|
$package['out_trade_no'] = $params['uniontid'];
|
|
$package['total_fee'] = $params['fee'] * 100;
|
|
$package['spbill_create_ip'] = CLIENT_IP;
|
|
$package['time_start'] = date('YmdHis', TIMESTAMP);
|
|
$package['time_expire'] = date('YmdHis', TIMESTAMP + 600);
|
|
$package['notify_url'] = MODULE_URL . 'payment/wechat/weixin_notify.php';
|
|
$package['trade_type'] = 'JSAPI';
|
|
$package['openid'] = empty($wechat['openid']) ? $_W['fans']['from_user'] : $wechat['openid'];
|
|
if (!empty($wechat['sub_appid'])) {
|
|
$package['sub_appid'] = $wechat['sub_appid'];
|
|
}
|
|
if (!empty($wechat['sub_mch_id'])) {
|
|
$package['sub_mch_id'] = $wechat['sub_mch_id'];
|
|
}
|
|
ksort($package, SORT_STRING);
|
|
$string1 = '';
|
|
foreach ($package as $key => $v) {
|
|
if (empty($v)) {
|
|
continue;
|
|
}
|
|
$string1 .= "{$key}={$v}&";
|
|
}
|
|
$string1 .= "key={$wechat['signkey']}";
|
|
$package['sign'] = strtoupper(md5($string1));
|
|
$dat = array2xml($package);
|
|
$response = ihttp_request('https://api.mch.weixin.qq.com/pay/unifiedorder', $dat);
|
|
if (is_error($response)) {
|
|
return $response;
|
|
}
|
|
$xml = @isimplexml_load_string($response['content'], 'SimpleXMLElement', LIBXML_NOCDATA);
|
|
if (strval($xml->return_code) == 'FAIL') {
|
|
return error(-1, strval($xml->return_msg));
|
|
}
|
|
if (strval($xml->result_code) == 'FAIL') {
|
|
return error(-1, strval($xml->err_code) . ': ' . strval($xml->err_code_des));
|
|
}
|
|
$prepayid = $xml->prepay_id;
|
|
$wOpt['appId'] = $wechat['appid'];
|
|
$wOpt['timeStamp'] = strval(TIMESTAMP);
|
|
$wOpt['nonceStr'] = random(8);
|
|
$wOpt['package'] = 'prepay_id=' . $prepayid;
|
|
$wOpt['signType'] = 'MD5';
|
|
ksort($wOpt, SORT_STRING);
|
|
foreach ($wOpt as $key => $v) {
|
|
$string .= "{$key}={$v}&";
|
|
}
|
|
$string .= "key={$wechat['signkey']}";
|
|
$wOpt['paySign'] = strtoupper(md5($string));
|
|
return $wOpt;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Comment: 生成支付信息时判断当前订单是否存在开通会员卡的操作,并进行相关操作
|
|
* Author: zzw
|
|
* @param $data 订单信息,必须存在vip_card_id & price字段
|
|
* @return mixed
|
|
*/
|
|
static function isOpenCard($data, $field = 'price') {
|
|
if ($data['vip_card_id'] > 0) {
|
|
//会员卡id存在 代表用户在购买商品时开通了vip卡
|
|
$cardPrice = pdo_getcolumn(PDO_NAME . "halfcard_type", array('id' => $data['vip_card_id']), 'price');
|
|
$data[$field] = sprintf("%.2f", $data[$field] + $cardPrice);
|
|
}
|
|
return $data;
|
|
}
|
|
}
|