172 lines
6.7 KiB
PHP
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
?>
|