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.
915 lines
39 KiB
915 lines
39 KiB
<?php
|
|
defined('IN_IA') or exit('Access Denied');
|
|
|
|
class WeixinPay {
|
|
|
|
//退款
|
|
public function refund($arr) {
|
|
global $_W;
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
|
|
$data['appid'] = $_W['account']['key'];
|
|
$data['mch_id'] = $setting['payment']['wechat']['mchid'];
|
|
|
|
$data['transaction_id'] = $arr['transid'];
|
|
$data['out_refund_no'] = $arr['transid'] . rand(1000, 9999);
|
|
|
|
$data['total_fee'] = $arr['totalmoney'] * 100;
|
|
$data['refund_fee'] = $arr['refundmoney'] * 100;
|
|
$data['op_user_id'] = $setting['payment']['wechat']['mchid'];
|
|
$data['nonce_str'] = $this->createNoncestr();
|
|
|
|
$data['sign'] = $this->getSign($data);
|
|
|
|
if (empty($data['appid']) || empty($data['mch_id'])) {
|
|
$rearr['return_msg'] = '请先在微擎的功能选项-支付参数内设置微信商户号和秘钥';
|
|
return $rearr;
|
|
}
|
|
if ($data['total_fee'] > $data['refund_fee']) {
|
|
$rearr['return_msg'] = '退款金额不能大于实际支付金额';
|
|
return $rearr;
|
|
}
|
|
$xml = $this->arrayToXml($data);
|
|
$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
|
|
$re = $this->wxHttpsRequestPem($xml, $url);
|
|
$rearr = $this->xmlToArray($re);
|
|
|
|
return $rearr;
|
|
}
|
|
|
|
//查询退款
|
|
public function checkRefund($transid) {
|
|
global $_W;
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
$data['appid'] = $_W['account']['key'];
|
|
$data['mch_id'] = $setting['payment']['wechat']['mchid'];
|
|
$data['transaction_id'] = $transid;
|
|
$data['nonce_str'] = $this->createNoncestr();
|
|
$data['sign'] = $this->getSign($data);
|
|
|
|
if (empty($data['appid']) || empty($data['mch_id'])) {
|
|
$rearr['return_msg'] = '请先在微擎的功能选项-支付参数内设置微信商户号和秘钥';
|
|
return $rearr;
|
|
}
|
|
$xml = $this->arrayToXml($data);
|
|
$url = "https://api.mch.weixin.qq.com/pay/refundquery";
|
|
$re = $this->wxHttpsRequestPem($xml, $url);
|
|
$rearr = $this->xmlToArray($re);
|
|
|
|
return $rearr;
|
|
}
|
|
|
|
//企业付款
|
|
public function finance($openid = '', $money = 0, $desc = '', $realname, $trade_no) {
|
|
global $_W;
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
|
|
$refund_setting = $setting['payment']['wechat_refund'];
|
|
if ($refund_setting['switch'] != 1) {
|
|
return error(1, '未开启微信退款功能!');
|
|
}
|
|
if (empty($refund_setting['key']) || empty($refund_setting['cert'])) {
|
|
return error(1, '缺少微信证书!');
|
|
}
|
|
$cert = authcode($refund_setting['cert'], 'DECODE');
|
|
$key = authcode($refund_setting['key'], 'DECODE');
|
|
file_put_contents(ATTACHMENT_ROOT . $_W['uniacid'] . '_wechat_refund_all.pem', $cert . $key);
|
|
|
|
$data = array();
|
|
$data['mch_appid'] = $_W['account']['key'];
|
|
$data['mchid'] = $setting['payment']['wechat']['mchid'];
|
|
$data['nonce_str'] = $this->createNoncestr();;
|
|
$data['partner_trade_no'] = $trade_no;
|
|
$data['openid'] = $openid;
|
|
if (!empty($realname)) {
|
|
$data['re_user_name'] = $realname;
|
|
}
|
|
$data['check_name'] = 'NO_CHECK';
|
|
$data['amount'] = $money * 100;
|
|
$data['desc'] = empty($desc) ? '商家佣金提现' : $desc;
|
|
$data['spbill_create_ip'] = gethostbyname($_SERVER["HTTP_HOST"]);
|
|
$data['sign'] = $this->getSign($data);
|
|
if (empty($data['mch_appid'])) {
|
|
$rearr['return_msg'] = '请先在微擎的功能选项-支付参数内设置微信商户号和秘钥';
|
|
return $rearr;
|
|
}
|
|
$xml = $this->arrayToXml($data);
|
|
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
|
|
$re = $this->wxHttpsRequestPem($xml, $url);
|
|
$rearr = $this->xmlToArray($re);
|
|
return $rearr;
|
|
}
|
|
|
|
public function createNoncestr($length = 32) {
|
|
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
$str = "";
|
|
for ($i = 0; $i < $length; $i++) {
|
|
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
function formatBizQueryParaMap($paraMap, $urlencode) {
|
|
$buff = "";
|
|
ksort($paraMap);
|
|
foreach ($paraMap as $k => $v) {
|
|
if ($urlencode) {
|
|
$v = urlencode($v);
|
|
}
|
|
$buff .= $k . "=" . $v . "&";
|
|
}
|
|
$reqPar;
|
|
if (strlen($buff) > 0) {
|
|
$reqPar = substr($buff, 0, strlen($buff) - 1);
|
|
}
|
|
return $reqPar;
|
|
}
|
|
|
|
public function getSign($Obj) {
|
|
global $_W;
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
foreach ($Obj as $k => $v) {
|
|
$Parameters[$k] = $v;
|
|
}
|
|
ksort($Parameters);
|
|
$String = $this->formatBizQueryParaMap($Parameters, false);
|
|
$String = $String . "&key=" . $setting['payment']['wechat']['apikey'];
|
|
$String = md5($String);
|
|
$result_ = strtoupper($String);
|
|
return $result_;
|
|
}
|
|
|
|
public function arrayToXml($arr) {
|
|
$xml = "<xml>";
|
|
foreach ($arr as $key => $val) {
|
|
if (is_numeric($val)) {
|
|
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
|
|
} else {
|
|
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
|
|
}
|
|
}
|
|
$xml .= "</xml>";
|
|
return $xml;
|
|
}
|
|
|
|
public function xmlToArray($xml) {
|
|
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
|
|
return $array_data;
|
|
}
|
|
|
|
|
|
public function wxHttpsRequestPem($vars, $url, $second = 30, $aHeader = array()) {
|
|
global $_W;
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
|
|
curl_setopt($ch, CURLOPT_SSLCERT, ATTACHMENT_ROOT . $_W['uniacid'] . '_wechat_refund_all.pem');
|
|
// curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
|
|
// curl_setopt($ch,CURLOPT_SSLKEY, PATH_DATA."cert/".$_W['uniacid']."/wechat/apiclient_key.pem");
|
|
// curl_setopt($ch,CURLOPT_CAINFO,'PEM');
|
|
// curl_setopt($ch,CURLOPT_CAINFO,IA_ROOT . '/attachment/feng_fightgroups/cert/' . $_W['uniacid'] . '/rootca.pem');
|
|
if (count($aHeader) >= 1) {
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
|
|
}
|
|
curl_setopt($ch, CURLOPT_POST, 1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
|
|
$data = curl_exec($ch);
|
|
unlink(ATTACHMENT_ROOT . $_W['uniacid'] . '_wechat_refund_all.pem');
|
|
if ($data) {
|
|
curl_close($ch);
|
|
return $data;
|
|
} else {
|
|
$error = curl_errno($ch);
|
|
echo "call faild, errorCode:$error\n";
|
|
curl_close($ch);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Comment: 发送微信红包
|
|
* Author: zzw
|
|
*/
|
|
static public function sendingRedPackets($info) {
|
|
global $_W;
|
|
#1、验证签名证书
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
$refund_setting = $setting['payment']['wechat_refund'];
|
|
if ($refund_setting['switch'] != 1) {
|
|
return error(1, '未开启微信付款功能!');
|
|
}
|
|
if (empty($refund_setting['key']) || empty($refund_setting['cert'])) {
|
|
return error(1, '缺少微信证书!');
|
|
}
|
|
$cert = authcode($refund_setting['cert'], 'DECODE');
|
|
$key = authcode($refund_setting['key'], 'DECODE');
|
|
file_put_contents(ATTACHMENT_ROOT . $_W['uniacid'] . '_wechat_refund_all.pem', $cert . $key);
|
|
#2、基本信息
|
|
$payment = $setting['payment'];
|
|
$cloud = Cloud::wl_syssetting_read('auth');
|
|
$info = array(
|
|
'nonce_str' => random(32),//随机码
|
|
'mch_billno' => $info['mch_billno'],//订单号
|
|
'mch_id' => $payment['wechat']['mchid'],//商户id
|
|
'wxappid' => $_W['account']['key'],//appid
|
|
'send_name' => $_W['wlsetting']['base']['name'],//平台名称
|
|
're_openid' => $info['re_openid'],//收款人openid
|
|
'total_amount' => $info['total_amount'],//发送金额 单位:分
|
|
'total_num' => 1,//发送数量
|
|
'wishing' => '恭喜发财,大吉大利',//留言
|
|
'client_ip' => $cloud['ip'],//发送主机ip
|
|
'act_name' => '红包提现',//$info['act_name'],//活动名称/商品名称
|
|
'remark' => $info['remark'],//备注信息
|
|
'scene_id' => 'PRODUCT_5'//使用场景 这里是渠道分润
|
|
);
|
|
#3、获取签名信息
|
|
ksort($info);
|
|
$sign = '';
|
|
foreach ($info as $k => $v) {
|
|
if (!empty($v)) {
|
|
$sign .= $k . '=' . $v . '&';
|
|
}
|
|
}
|
|
$sign .= "key=" . $setting['payment']['wechat']['apikey'];
|
|
$info['sign'] = strtoupper(md5($sign));
|
|
$pay = new WeixinPay();
|
|
$xml = $pay->arrayToXml($info);
|
|
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
|
|
$re = $pay->wxHttpsRequestPem($xml, $url);
|
|
$rearr = $pay->xmlToArray($re);
|
|
return $rearr;
|
|
}
|
|
|
|
/**
|
|
* Comment: 红包打款 查询接口
|
|
* Author: zzw
|
|
* @return array|mixed
|
|
*/
|
|
static public function getRedPacketsInfo($info) {
|
|
global $_W;
|
|
#1、验证签名证书
|
|
$setting = uni_setting($_W['uniacid'], array('payment'));
|
|
$refund_setting = $setting['payment']['wechat_refund'];
|
|
if ($refund_setting['switch'] != 1) {
|
|
return error(1, '未开启微信付款功能!');
|
|
}
|
|
if (empty($refund_setting['key']) || empty($refund_setting['cert'])) {
|
|
return error(1, '缺少微信证书!');
|
|
}
|
|
$cert = authcode($refund_setting['cert'], 'DECODE');
|
|
$key = authcode($refund_setting['key'], 'DECODE');
|
|
file_put_contents(ATTACHMENT_ROOT . $_W['uniacid'] . '_wechat_refund_all.pem', $cert . $key);
|
|
#2、基本信息
|
|
$payment = $setting['payment'];
|
|
$info = array(
|
|
'nonce_str' => random(32),
|
|
'mch_billno' => $info['mch_billno'],
|
|
'mch_id' => $payment['wechat']['mchid'],
|
|
'appid' => $_W['account']['key'],
|
|
'bill_type' => 'MCHT',
|
|
);
|
|
#3、获取签名信息
|
|
ksort($info);
|
|
$sign = '';
|
|
foreach ($info as $k => $v) {
|
|
if (!empty($v)) {
|
|
$sign .= $k . '=' . $v . '&';
|
|
}
|
|
}
|
|
$sign .= "key=" . $setting['payment']['wechat']['apikey'];
|
|
$info['sign'] = strtoupper(md5($sign));
|
|
$pay = new WeixinPay();
|
|
$xml = $pay->arrayToXml($info);
|
|
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo';
|
|
$re = $pay->wxHttpsRequestPem($xml, $url);
|
|
$rearr = $pay->xmlToArray($re);
|
|
return $rearr;
|
|
}
|
|
|
|
/**
|
|
* Comment: 获取平台分账信息
|
|
* Author: wlf
|
|
* Date: 2020/09/04 11:24
|
|
*/
|
|
public function getSysAllInfo($price,$source,$set,$uniacid){
|
|
global $_W;
|
|
$_W['uniacid'] = $uniacid;
|
|
$cashset = Setting::wlsetting_read('cashset');
|
|
$payment_set = Setting::wlsetting_read('payment_set');
|
|
if($source != 3 && $cashset['wxsyspercent'] > 0){
|
|
$sysmoney = $price * $cashset['wxsyspercent'];
|
|
if($sysmoney > 0){
|
|
$paysetid = $payment_set['wechat']['wechat'];
|
|
// if($_W['wlsetting']['cashset']['wxsysalltype'] == 1){
|
|
// //添加关系
|
|
// $res = self::addReceiver('MERCHANT_ID',$_W['wlsetting']['cashset']['wxmerchantid'],'SERVICE_PROVIDER',$_W['wlsetting']['cashset']['wxmerchantname'],$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
// $data = [
|
|
// 'type' => 'MERCHANT_ID',
|
|
// 'account' => $_W['wlsetting']['cashset']['wxmerchantid'],
|
|
// 'amount' => $sysmoney,
|
|
// 'description' => '平台抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }else if($_W['wlsetting']['cashset']['wxsysalltype'] == 2){
|
|
// $cashopenid = pdo_getcolumn(PDO_NAME.'member',array('id'=>$_W['wlsetting']['cashset']['wxallmid']),'openid');
|
|
// $res = self::addReceiver('PERSONAL_OPENID',$cashopenid,'SERVICE_PROVIDER','',$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
|
|
// $data = [
|
|
// 'type' => 'PERSONAL_OPENID',
|
|
// 'account' => $cashopenid,
|
|
// 'amount' => $sysmoney,
|
|
// 'description' => '平台抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }
|
|
}
|
|
}else if($source == 3 && $cashset['appsyspercent'] > 0){
|
|
$sysmoney = $price * $cashset['appsyspercent'];
|
|
if($sysmoney > 0){
|
|
$paysetid = $payment_set['wxapp']['wechat'];
|
|
// if($_W['wlsetting']['cashset']['appsysalltype'] == 1){
|
|
// $res = self::addReceiver('MERCHANT_ID',$_W['wlsetting']['cashset']['appmerchantid'],'SERVICE_PROVIDER',$_W['wlsetting']['cashset']['appmerchantname'],$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
|
|
// $data = [
|
|
// 'type' => 'MERCHANT_ID',
|
|
// 'account' => $_W['wlsetting']['cashset']['appmerchantid'],
|
|
// 'amount' => $sysmoney,
|
|
// 'description' => '平台抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }else if($_W['wlsetting']['cashset']['appsysalltype'] == 2){
|
|
// $cashopenid = pdo_getcolumn(PDO_NAME.'member',array('id'=>$_W['wlsetting']['cashset']['appallmid']),'wechat_openid');
|
|
// $res = self::addReceiver('PERSONAL_OPENID',$cashopenid,'SERVICE_PROVIDER','',$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
|
|
// $data = [
|
|
// 'type' => 'PERSONAL_OPENID',
|
|
// 'account' => $cashopenid,
|
|
// 'amount' => $sysmoney,
|
|
// 'description' => '平台抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }
|
|
}
|
|
}
|
|
if($paysetid > 0){
|
|
$info = pdo_get(PDO_NAME."payment",['id'=>$paysetid]);
|
|
$Setinfo = json_decode($info['param'],true);
|
|
$res = self::addReceiver('MERCHANT_ID',$Setinfo['sub_shop_number'],'SERVICE_PROVIDER',$Setinfo['merchantname'],$set);
|
|
if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
$data = [
|
|
'type' => 'MERCHANT_ID',
|
|
'account' => $Setinfo['sub_shop_number'],
|
|
'amount' => $sysmoney,
|
|
'description' => '平台抽佣',
|
|
];
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
}
|
|
}
|
|
return !empty($data) ? $data : 0;
|
|
}
|
|
|
|
/**
|
|
* Comment: 获取分销分账信息
|
|
* Author: wlf
|
|
* Date: 2020/09/04 14:15
|
|
*/
|
|
public function getDisAllInfo($disid,$disprice,$source,$set){
|
|
global $_W;
|
|
if($source == 1){
|
|
$openid = pdo_getcolumn(PDO_NAME.'member',array('distributorid'=>$disid),'openid');
|
|
}else{
|
|
$openid = pdo_getcolumn(PDO_NAME.'member',array('distributorid'=>$disid),'wechat_openid');
|
|
}
|
|
if(!empty($openid)){
|
|
$res = self::addReceiver('PERSONAL_OPENID',$openid,'DISTRIBUTOR','',$set);
|
|
if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
|
|
$data = [
|
|
'type' => 'PERSONAL_OPENID',
|
|
'account' => $openid,
|
|
'amount' => $disprice * 100,
|
|
'description' => '分佣',
|
|
];
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
}
|
|
}
|
|
return !empty($data) ? $data : 0;
|
|
}
|
|
|
|
/**
|
|
* Comment: 获取业务员分账信息
|
|
* Author: wlf
|
|
* Date: 2020/09/04 15:53
|
|
*/
|
|
public function getSaleAllInfo($mid,$salesprice,$source,$set){
|
|
global $_W;
|
|
if($source == 1){
|
|
$openid = pdo_getcolumn(PDO_NAME.'member',array('mid'=>$mid),'openid');
|
|
}else{
|
|
$openid = pdo_getcolumn(PDO_NAME.'member',array('mid'=>$mid),'wechat_openid');
|
|
}
|
|
if(!empty($openid)){
|
|
$res = self::addReceiver('PERSONAL_OPENID',$openid,'STAFF','',$set);
|
|
if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
|
|
$data = [
|
|
'type' => 'PERSONAL_OPENID',
|
|
'account' => $openid,
|
|
'amount' => $salesprice * 100,
|
|
'description' => '业务员',
|
|
];
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
}
|
|
}
|
|
return !empty($data) ? $data : 0;
|
|
}
|
|
|
|
/**
|
|
* Comment: 获取代理分账信息
|
|
* Author: wlf
|
|
* Date: 2020/09/04 16:09
|
|
*/
|
|
public function getAgentAllInfo($aid,$agentprice,$source,$set){
|
|
global $_W;
|
|
$agentset = pdo_get('wlmerchant_agentusers',array('id' => $aid),array('wxpaysetid','apppaysetid'));
|
|
if($source == 1 || $source == 2){
|
|
$paysetid = $agentset['wxpaysetid'];
|
|
// if($agentset['wxsysalltype'] == 1){
|
|
// //添加关系
|
|
// $res = self::addReceiver('MERCHANT_ID',$agentset['wxmerchantid'],'PARTNER',$agentset['wxmerchantname'],$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
// $data = [
|
|
// 'type' => 'MERCHANT_ID',
|
|
// 'account' => $agentset['wxmerchantid'],
|
|
// 'amount' => $agentprice * 100,
|
|
// 'description' => '代理抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }else{
|
|
// //添加关系
|
|
// $cashopenid = pdo_getcolumn(PDO_NAME.'member',array('id'=>$agentset['wxallmid']),'openid');
|
|
// $res = self::addReceiver('PERSONAL_OPENID',$cashopenid,'PARTNER','',$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
// $data = [
|
|
// 'type' => 'PERSONAL_OPENID',
|
|
// 'account' => $cashopenid,
|
|
// 'amount' => $agentprice * 100,
|
|
// 'description' => '代理抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }
|
|
}else if($source == 3){
|
|
$paysetid = $agentset['apppaysetid'];
|
|
// if($agentset['appsysalltype'] == 1){
|
|
// //添加关系
|
|
// $res = self::addReceiver('MERCHANT_ID',$agentset['appmerchantid'],'PARTNER',$agentset['appmerchantname'],$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
// $data = [
|
|
// 'type' => 'MERCHANT_ID',
|
|
// 'account' => $agentset['appmerchantid'],
|
|
// 'amount' => $agentprice * 100,
|
|
// 'description' => '代理抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }else{
|
|
// //添加关系
|
|
// $cashopenid = pdo_getcolumn(PDO_NAME.'member',array('id'=>$agentset['appallmid']),'wechat_openid');
|
|
// $res = self::addReceiver('PERSONAL_OPENID',$cashopenid,'PARTNER','',$set);
|
|
// if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
// $data = [
|
|
// 'type' => 'PERSONAL_OPENID',
|
|
// 'account' => $cashopenid,
|
|
// 'amount' => $agentprice * 100,
|
|
// 'description' => '代理抽佣',
|
|
// ];
|
|
// }else{
|
|
// file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
// }
|
|
// }
|
|
}
|
|
if($paysetid > 0){
|
|
$info = pdo_get(PDO_NAME."payment",['id'=>$paysetid]);
|
|
$Setinfo = json_decode($info['param'],true);
|
|
$res = self::addReceiver('MERCHANT_ID',$Setinfo['sub_shop_number'],'SERVICE_PROVIDER',$Setinfo['merchantname'],$set);
|
|
if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
|
|
$data = [
|
|
'type' => 'MERCHANT_ID',
|
|
'account' => $Setinfo['sub_shop_number'],
|
|
'amount' => $agentprice * 100,
|
|
'description' => '代理抽佣',
|
|
];
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($res, true) . PHP_EOL, FILE_APPEND);
|
|
}
|
|
}
|
|
return !empty($data) ? $data : 0;
|
|
}
|
|
|
|
/**
|
|
* Comment: 服务商订单结算分账借口
|
|
* Author: wlf
|
|
* Date: 2020/09/08 14:10
|
|
*/
|
|
public function allocationPro($orderid,$type,$source,$salesinfo = [],$salesmoney = 0){
|
|
global $_W;
|
|
$receivers = [];
|
|
$sysmoney = $disonemoney = $distwomoney = $storemoney = 0;
|
|
//获取订单数据
|
|
switch ($type){
|
|
case '1':
|
|
$order = pdo_get(PDO_NAME.'rush_order',array('id'=>$orderid),array('sid','uniacid','settlementmoney','transid','aid','paysetid','orderno','actualprice','disorderid'));
|
|
$price = $order['actualprice'];
|
|
$storemoney = $order['settlementmoney'];
|
|
break;
|
|
case '4':
|
|
$order = pdo_get(PDO_NAME.'halfcard_record',array('id'=>$orderid),array('transid','uniacid','aid','paysetid','orderno','price','disorderid'));
|
|
$price = $order['price'];
|
|
break;
|
|
default :
|
|
$order = pdo_get(PDO_NAME.'order',array('id'=>$orderid),array('sid','settlementmoney','transid','uniacid','plugin','aid','paysetid','orderno','price','disorderid'));
|
|
$price = $order['price'];
|
|
$plugin = $order['plugin'];
|
|
$storemoney = $order['settlementmoney'];
|
|
break;
|
|
}
|
|
if(empty($order['transid'])) {
|
|
$order['transid'] = pdo_getcolumn(PDO_NAME . 'paylogvfour', array('tid' => $order['orderno']), 'transaction_id');
|
|
}
|
|
//基础信息
|
|
$getUrl = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
|
|
$filePath = PATH_ATTACHMENT . "public_file/" . MODULE_NAME . "/";
|
|
$id = $order['paysetid'];
|
|
$info = pdo_get(PDO_NAME."payment",['id'=>$id]);
|
|
$setting = json_decode($info['param'],true);
|
|
//获取平台分账信息
|
|
$sysinfo = self::getSysAllInfo($price,$source,$setting,$order['uniacid']);
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $sysinfo;
|
|
$sysmoney = sprintf("%.2f",$sysinfo['amount'] / 100);
|
|
}
|
|
//获取分销分账信息
|
|
if($order['disorderid'] > 0){
|
|
$disorder = pdo_get('wlmerchant_disorder',array('id' => $order['disorderid']),array('oneleadid','twoleadid','leadmoney'));
|
|
$leadmoney = unserialize($disorder['leadmoney']);
|
|
if($disorder['oneleadid'] > 0 && $leadmoney['one'] > 0){
|
|
$onedisinfo = self::getDisAllInfo($disorder['oneleadid'],$leadmoney['one'],$source,$setting);
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $onedisinfo;
|
|
}
|
|
$disonemoney = $leadmoney['one'];
|
|
}
|
|
if($disorder['twoleadid'] > 0 && $leadmoney['two'] > 0){
|
|
$onedisinfo = self::getDisAllInfo($disorder['twoleadid'],$leadmoney['two'],$source,$setting);
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $onedisinfo;
|
|
}
|
|
$distwomoney = $leadmoney['two'];
|
|
}
|
|
}
|
|
//获取业务员信息
|
|
if(!empty($salesinfo) && $salesmoney > 0){
|
|
foreach($salesinfo as $sinfo){
|
|
$saleallinfo = self::getSaleAllInfo($sinfo['mid'],$sinfo['reportmoney'],$source,$setting);
|
|
if(!empty($saleallinfo)){
|
|
$receivers[] = $saleallinfo;
|
|
}
|
|
}
|
|
}
|
|
//获取代理分账信息
|
|
if(!empty($order['sid']) || $plugin == 'store'){
|
|
$agentmoney = sprintf("%.2f",$price - $sysmoney - $disonemoney - $storemoney - $distwomoney - $salesmoney);
|
|
if($agentmoney > 0 && $order['aid'] > 0){
|
|
$agentallinfo = self::getAgentAllInfo($order['aid'],$agentmoney,$source,$setting);
|
|
if(!empty($agentallinfo)){
|
|
$receivers[] = $agentallinfo;
|
|
}
|
|
}
|
|
}
|
|
|
|
//生成分账方面
|
|
if(count($receivers)>0){
|
|
$receivers = json_encode($receivers);
|
|
$data = [
|
|
'mch_id' => $setting['shop_number'],
|
|
'sub_mch_id' => $setting['sub_shop_number'],
|
|
'appid' => $setting['sub_up_app_id'],
|
|
'nonce_str' => $this -> createNoncestr(),
|
|
'transaction_id' => $order['transid'],
|
|
'out_order_no' => 'PP'.date('YmdHis').random(4,1),
|
|
'receivers' => $receivers,
|
|
];
|
|
$data['sign'] = $this->getWlfSign($data,$setting['secret_key']);
|
|
|
|
$cert = trim($filePath . $setting['cert_certificate']);
|
|
$key = trim($filePath . $setting['key_certificate']);
|
|
|
|
$xml = $this->arrayToXml($data);
|
|
$re = $this->wxWlfHttpsRequestPem($xml,$getUrl,30,[],$cert,$key);
|
|
$rearr = $this->xmlToArray($re);
|
|
if($rearr['return_code'] == 'SUCCESS' && $rearr['result_code'] == 'SUCCESS'){
|
|
$result = [
|
|
'status' => 1,
|
|
'agentmoney' => $agentmoney > 0 ? $agentmoney : 0,
|
|
'sysmoney' => $sysmoney
|
|
];
|
|
return $result;
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($rearr, true) . PHP_EOL, FILE_APPEND);
|
|
return 0;
|
|
}
|
|
}else{
|
|
//完成结算
|
|
$data = [
|
|
'mch_id' => $setting['shop_number'],
|
|
'sub_mch_id' => $setting['sub_shop_number'],
|
|
'appid' => $setting['sub_up_app_id'],
|
|
'nonce_str' => $this -> createNoncestr(),
|
|
'transaction_id' => $order['transid'],
|
|
'out_order_no' => 'PP'.date('YmdHis').random(4,1),
|
|
'description' => '分账已完成',
|
|
];
|
|
$data['sign'] = $this->getWlfSign($data,$setting['secret_key']);
|
|
$cert = trim($filePath . $setting['cert_certificate']);
|
|
$key = trim($filePath . $setting['key_certificate']);
|
|
|
|
$getUrl = 'https://api.mch.weixin.qq.com/secapi/pay/profitsharingfinish';
|
|
$xml = $this->arrayToXml($data);
|
|
$re = $this->wxWlfHttpsRequestPem($xml,$getUrl,30,[],$cert,$key);
|
|
$rearr = $this->xmlToArray($re);
|
|
if($rearr['return_code'] == 'SUCCESS' && $rearr['result_code'] == 'SUCCESS'){
|
|
$result = [
|
|
'status' => 1,
|
|
'agentmoney' => $agentmoney > 0 ? $agentmoney : 0,
|
|
'sysmoney' => $sysmoney > 0 ? : 0
|
|
];
|
|
return $result;
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($rearr, true) . PHP_EOL, FILE_APPEND);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Comment: 服务商核销码分账借口
|
|
* Author: wlf
|
|
* Date: 2020/08/31 10:46
|
|
*/
|
|
public function allocationMulti($orderid,$source,$salesinfo = [],$salesmoney = 0){ // $source = 1公众号 3小程序
|
|
global $_W;
|
|
//获取订单数据
|
|
$receivers = [];
|
|
$sysmoney = 0;
|
|
$smallorder = pdo_get('wlmerchant_smallorder',array('id' => $orderid),array('aid','orderprice','plugin','orderid','settlemoney','sid','oneleadid','twoleadid','onedismoney','twodismoney'));
|
|
$price = $smallorder['orderprice'];
|
|
if($smallorder['plugin'] == 'rush'){
|
|
$order = pdo_get('wlmerchant_rush_order',array('id' => $smallorder['orderid']),array('transid','uniacid','paysetid','orderno','allocationtype'));
|
|
}else{
|
|
$order = pdo_get('wlmerchant_order',array('id' => $smallorder['orderid']),array('transid','uniacid','paysetid','orderno','allocationtype'));
|
|
}
|
|
if(empty($order['transid'])) {
|
|
$order['transid'] = pdo_getcolumn(PDO_NAME . 'paylogvfour', array('tid' => $order['orderno']), 'transaction_id');
|
|
}
|
|
//基础信息
|
|
$getUrl = "https://api.mch.weixin.qq.com/secapi/pay/multiprofitsharing";
|
|
$filePath = PATH_ATTACHMENT . "public_file/" . MODULE_NAME . "/";
|
|
$id = $order['paysetid'];
|
|
$info = pdo_get(PDO_NAME."payment",['id'=>$id]);
|
|
$setting = json_decode($info['param'],true);
|
|
|
|
//获取平台分账信息
|
|
$sysinfo = self::getSysAllInfo($price,$source,$setting,$order['uniacid']);
|
|
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $sysinfo;
|
|
$sysmoney = sprintf("%.2f",$sysinfo['amount'] / 100);
|
|
}
|
|
//获取分销分账信息
|
|
if($smallorder['oneleadid'] > 0 && $smallorder['onedismoney'] > 0){
|
|
$onedisinfo = self::getDisAllInfo($smallorder['oneleadid'],$smallorder['onedismoney'],$source,$setting);
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $onedisinfo;
|
|
}
|
|
}
|
|
if($smallorder['twoleadid'] > 0 && $smallorder['twodismoney'] > 0){
|
|
$onedisinfo = self::getDisAllInfo($smallorder['twoleadid'],$smallorder['twodismoney'],$source,$setting);
|
|
if(!empty($sysinfo)){
|
|
$receivers[] = $onedisinfo;
|
|
}
|
|
}
|
|
//获取业务员信息
|
|
if(!empty($salesinfo) && $salesmoney > 0){
|
|
foreach($salesinfo as $sinfo){
|
|
$saleallinfo = self::getSaleAllInfo($sinfo['mid'],$sinfo['reportmoney'],$source,$setting);
|
|
if(!empty($saleallinfo)){
|
|
$receivers[] = $saleallinfo;
|
|
}
|
|
}
|
|
}
|
|
//获取代理分账信息
|
|
$agentmoney = sprintf("%.2f",$price - $sysmoney - $smallorder['settlemoney'] - $smallorder['onedismoney'] - $smallorder['twodismoney'] - $salesmoney);
|
|
if($agentmoney > 0 && $smallorder['aid'] > 0){
|
|
$agentallinfo = self::getAgentAllInfo($smallorder['aid'],$agentmoney,$source,$setting);
|
|
if(!empty($agentallinfo)){
|
|
$receivers[] = $agentallinfo;
|
|
}
|
|
}
|
|
//生成分账方面
|
|
if(count($receivers)>0){
|
|
$receivers = json_encode($receivers);
|
|
$data = [
|
|
'mch_id' => $setting['shop_number'],
|
|
'sub_mch_id' => $setting['sub_shop_number'],
|
|
'appid' => $setting['sub_up_app_id'],
|
|
'nonce_str' => $this -> createNoncestr(),
|
|
'transaction_id' => $order['transid'],
|
|
'out_order_no' => 'PP'.date('YmdHis').random(4,1),
|
|
'receivers' => $receivers,
|
|
];
|
|
$data['sign'] = $this->getWlfSign($data,$setting['secret_key']);
|
|
|
|
$cert = trim($filePath . $setting['cert_certificate']);
|
|
$key = trim($filePath . $setting['key_certificate']);
|
|
|
|
$xml = $this->arrayToXml($data);
|
|
$re = $this->wxWlfHttpsRequestPem($xml,$getUrl,30,[],$cert,$key);
|
|
$rearr = $this->xmlToArray($re);
|
|
if($rearr['return_code'] == 'SUCCESS' && $rearr['result_code'] == 'SUCCESS'){
|
|
$result = [
|
|
'status' => 1,
|
|
'agentmoney' => $agentmoney > 0 ? $agentmoney : 0,
|
|
'sysmoney' => $sysmoney
|
|
];
|
|
return $result;
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($rearr, true) . PHP_EOL, FILE_APPEND);
|
|
return 0;
|
|
}
|
|
}else{
|
|
$result = [
|
|
'status' => 1,
|
|
'agentmoney' => $agentmoney > 0 ? $agentmoney : 0,
|
|
'sysmoney' => $sysmoney > 0 ? : 0
|
|
];
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Comment: 添加分账方接口
|
|
* Author: wlf
|
|
* Date: 2020/08/31 15:27
|
|
*/
|
|
public function addReceiver($type,$account,$relation_type,$name = '',$setting){
|
|
global $_W;
|
|
$getUrl = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
|
|
//生成分账方面
|
|
$receiver = [
|
|
'type' => $type,
|
|
'account' => $account,
|
|
'relation_type' => $relation_type,
|
|
];
|
|
if($type == 'MERCHANT_ID'){
|
|
$receiver['name'] = $name;
|
|
}
|
|
$receiver = json_encode($receiver);
|
|
$data = [
|
|
'mch_id' => $setting['shop_number'],
|
|
'sub_mch_id' => $setting['sub_shop_number'],
|
|
'appid' => $setting['sub_up_app_id'],
|
|
'nonce_str' => $this -> createNoncestr(),
|
|
'receiver' => $receiver,
|
|
];
|
|
$data['sign'] = $this->getWlfSign($data,$setting['secret_key']);
|
|
$xml = $this->arrayToXml($data);
|
|
$re = $this->wxWlfHttpsRequestPem($xml,$getUrl);
|
|
$rearr = $this->xmlToArray($re);
|
|
|
|
return $rearr;
|
|
}
|
|
|
|
/**
|
|
* Comment: 完结分账接口
|
|
* Author: wlf
|
|
* Date: 2020/09/04 18:10
|
|
*/
|
|
public function allocationFinish($orderid){
|
|
global $_W;
|
|
$smallorder = pdo_get('wlmerchant_smallorder',array('id' => $orderid),array('aid','orderprice','plugin','orderid','settlemoney','sid','oneleadid','twoleadid','onedismoney','twodismoney'));
|
|
$price = $smallorder['orderprice'];
|
|
if($smallorder['plugin'] == 'rush'){
|
|
$order = pdo_get('wlmerchant_rush_order',array('id' => $smallorder['orderid']),array('transid','paysetid','orderno','allocationtype'));
|
|
}else{
|
|
$order = pdo_get('wlmerchant_order',array('id' => $smallorder['orderid']),array('transid','paysetid','orderno','allocationtype'));
|
|
}
|
|
if(empty($order['transid'])) {
|
|
$order['transid'] = pdo_getcolumn(PDO_NAME . 'paylogvfour', array('tid' => $order['orderno']), 'transaction_id');
|
|
}
|
|
//基础信息
|
|
$getUrl = "https://api.mch.weixin.qq.com/secapi/pay/profitsharingfinish";
|
|
$filePath = PATH_ATTACHMENT . "public_file/" . MODULE_NAME . "/";
|
|
$id = $order['paysetid'];
|
|
$info = pdo_get(PDO_NAME."payment",['id'=>$id]);
|
|
$setting = json_decode($info['param'],true);
|
|
|
|
$data = [
|
|
'mch_id' => $setting['shop_number'],
|
|
'sub_mch_id' => $setting['sub_shop_number'],
|
|
'appid' => $setting['sub_up_app_id'],
|
|
'nonce_str' => $this -> createNoncestr(),
|
|
'transaction_id' => $order['transid'],
|
|
'out_order_no' => 'PP'.date('YmdHis').random(4,1),
|
|
'description' => '订单已完成',
|
|
];
|
|
$data['sign'] = $this->getWlfSign($data,$setting['secret_key']);
|
|
|
|
$cert = trim($filePath . $setting['cert_certificate']);
|
|
$key = trim($filePath . $setting['key_certificate']);
|
|
|
|
$xml = $this->arrayToXml($data);
|
|
$re = $this->wxWlfHttpsRequestPem($xml,$getUrl,30,[],$cert,$key);
|
|
$rearr = $this->xmlToArray($re);
|
|
if($rearr['return_code'] == 'SUCCESS' && $rearr['result_code'] == 'SUCCESS'){
|
|
return 1;
|
|
}else{
|
|
file_put_contents(PATH_DATA . "allocation_error.log", var_export($rearr, true) . PHP_EOL, FILE_APPEND);
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public function wxWlfHttpsRequestPem($vars, $url, $second = 30, $aHeader = array(),$cert = '',$key = '') {
|
|
global $_W;
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
if(!empty($cert)){
|
|
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
|
|
curl_setopt($ch, CURLOPT_SSLCERT,$cert);
|
|
}
|
|
if(!empty($key)){
|
|
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
|
|
curl_setopt($ch, CURLOPT_SSLKEY,$key);
|
|
}
|
|
// curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
|
|
// curl_setopt($ch,CURLOPT_SSLKEY, PATH_DATA."cert/".$_W['uniacid']."/wechat/apiclient_key.pem");
|
|
// curl_setopt($ch,CURLOPT_CAINFO,'PEM');
|
|
// curl_setopt($ch,CURLOPT_CAINFO,IA_ROOT . '/attachment/feng_fightgroups/cert/' . $_W['uniacid'] . '/rootca.pem');
|
|
if (count($aHeader) >= 1) {
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
|
|
}
|
|
curl_setopt($ch, CURLOPT_POST, 1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
|
|
$data = curl_exec($ch);
|
|
if ($data) {
|
|
curl_close($ch);
|
|
return $data;
|
|
} else {
|
|
$error = curl_errno($ch);
|
|
echo "call faild, errorCode:$error\n";
|
|
curl_close($ch);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function getWlfSign($Obj,$key) {
|
|
global $_W;
|
|
foreach ($Obj as $k => $v) {
|
|
$Parameters[$k] = $v;
|
|
}
|
|
ksort($Parameters);
|
|
$String = $this->formatBizQueryParaMap($Parameters, false);
|
|
$String = $String . "&key=" . $key;
|
|
$String = hash_hmac("sha256",$String,$key);
|
|
$result_ = strtoupper($String);
|
|
return $result_;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
?>
|