app_id = $param['app_id'] ? $param['app_id'] : 1; //默认狸车 switch ($this->app_id) { case 1://狸车 $this->wx_config_file = 'liche_WxPay.Config.php'; break; case 3://小红榜 $this->wx_config_file = 'fy_WxPay.Config.php'; break; default: } } public function wxPayConfig() { require_once APPPATH . "../home/third_party/WXconfig/" . $this->wx_config_file; $config = new WxPayConfig(); return $config; } /** * 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 . "../home/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 = ''; foreach ($data as $k => $v) { $str .= '<' . $k . '>' . $v . ''; } $str .= ''; 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; } } } ?>