Files
liche/api/libraries/Transfers.php
T
2021-07-05 09:56:27 +08:00

172 lines
6.7 KiB
PHP

<?php
/**
* Notes:企业付款到微信零钱
* Created on: 2020/7/12 15:49
* Created by: dengbw
*/
class Transfers
{
private $app_id;
private $wx_config_file; //配制文件地址
public function __construct($param = array())
{
$this->app_id = $param['app_id'] ? $param['app_id'] : 3; //默认飞鱼
switch ($this->app_id) {
case 3://飞鱼
$this->wx_config_file = 'fy_WxPay.Config.php';
break;
case 14://欧菲帮我美
$this->wx_config_file = 'ofei_WxPay.Config.php';
break;
case 15://星盟卡
$this->wx_config_file = 'xmcard_WxPay.Config.php';
break;
default:
}
}
/**
* Notes:企业付款到零钱
* 接口介绍 https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
* Created on: 2020/7/12 18:03
* Created by: dengbw
* @param array $param
* @return bool|mixed|SimpleXMLElement|string
*/
public function sendMoney($param = array())
{
require_once APPPATH . "../api/third_party/WXconfig/" . $this->wx_config_file;
$config = new WxPayConfig();
$partner_trade_no = $param['partner_trade_no'] ? $param['partner_trade_no']
: date('YmdHis') . rand(1000, 9999);//商户订单号
$amount = (100) * $param['amount']; //发送的金额(分)目前发送金额不能少于1元
$openid = $param['openid'];//发送人的 openid
$desc = $param['desc'] ? $param['desc'] : '提现';//企业付款描述信息 (必填)
$re_user_name = $param['re_user_name'] ? $param['re_user_name'] : '';//收款用户姓名 (选填)
$data = array(
'mch_appid' => $config::APPID,//商户账号appid
'mchid' => $config::MCHID,//商户号
'nonce_str' => $this->createNoncestr(),//随机字符串
'partner_trade_no' => $partner_trade_no,//商户订单号
'openid' => $openid,//用户openid
'check_name' => 'NO_CHECK',//校验用户姓名选项,
're_user_name' => $re_user_name,//收款用户姓名
'amount' => $amount,//金额
'desc' => $desc,//企业付款描述信息
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],//Ip地址
);
//生成签名算法
$secrect_key = $config::KEY;///这个就是个API密码。MD5 32位。
$data = array_filter($data);
ksort($data);
$str = '';
foreach ($data as $k => $v) {
$str .= $k . '=' . $v . '&';
}
$str .= 'key=' . $secrect_key;
$data['sign'] = md5($str);
//生成签名算法
$xml = $this->arraytoxml($data);
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口
$res = $this->curl_post_ssl($url, $xml, $config);
$return = $this->xmltoarray($res);
return $return;
print_r($return);
//返回来的结果
// [return_code] => SUCCESS [return_msg] => Array ( ) [mch_appid] => wxd44be6876gg73 [mchid] => 76775512 [nonce_str] => 616615516 [result_code] => SUCCESS [partner_trade_no] => 20186505080216815
// [payment_no] => 1000018361251805057502564679 [payment_time] => 2018-05-15 15:29:50
$responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
echo $res = $responseObj->return_code; //SUCCESS 如果返回来SUCCESS,则发生成功,处理自己的逻辑
return $res;
}
/**
* [xmltoarray xml格式转换为数组]
* @param [type] $xml [xml]
* @return [type] [xml 转化为array]
*/
public function xmltoarray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
/**
* [arraytoxml 将数组转换成xml格式(简单方法):]
* @param [type] $data [数组]
* @return [type] [array 转 xml]
*/
public function arraytoxml($data)
{
$str = '<xml>';
foreach ($data as $k => $v) {
$str .= '<' . $k . '>' . $v . '</' . $k . '>';
}
$str .= '</xml>';
return $str;
}
/**
* [createNoncestr 生成随机字符串]
* @param integer $length [长度]
* @return [type] [字母大小写加数字]
*/
public function createNoncestr($length = 32)
{
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* [curl_post_ssl 发送curl_post数据]
* @param [type] $url [发送地址]
* @param [type] $xmldata [发送文件格式]
* @param [type] $second [设置执行最长秒数]
* @param [type] $aHeader [设置头部]
* @return [type] [description]
*/
function curl_post_ssl($url, $vars, $config, $second = 30, $aHeader = array())
{
//设置证书位置
$sslCertPath = $config::SSLCERT_PATH;
$sslKeyPath = $config::SSLKEY_PATH;
$ch = curl_init();//初始化curl
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, $sslCertPath);//证书位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
curl_setopt($ch, CURLOPT_SSLKEY, $sslKeyPath);//证书位置
//curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
//curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送
$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;
}
}
}
?>