商户号(或同主体其他非服务商商户号)已入驻90日
商户号(或同主体其他非服务商商户号)有30天连续正常交易
登录微信支付商户平台-产品中心,开通企业付款。
/**
* 企业支付(向微信发起企业支付到零钱的请求)
* @param string $openid 用户openID
* @param string $trade_no 单号
* @param string $money 金额(单位分)
* @param string $desc 描述
* @param string appid协会appid∗@returnstringXML结构的字符串∗∗/publicfunctiontxFunc(inputs)
{
$params = array(
'mch_appid' => $inputs['appid'], //小程序id
'mchid' => $inputs['mchid'], //商户id
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端ip
'nonce_str' => $this->getNonceStr(), //随机字符串
'partner_trade_no' => $inputs['orderid'], //商户订单号,需要唯一
'openid' => $inputs['openid'],
'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
'amount' => $inputs['amount'], //总金额 //付款金额单位为分
'desc' => $inputs['body'],
//'re_user_name' => 'jorsh', //收款人用户姓名 *选填
//'device_info' => '1000', //设备号 *选填
);
//生成签名
$sign = $this->sign($params, $inputs['key']); //商户秘钥
$params['sign'] = $sign;
//构造XML数据(数据包要以xml格式进行发送)
//将数组内容转为xml格式,向微信发出请求
$xmlData = $this->arrayToXml($params);
$xml_result = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', $xmlData, 60);
$result = $this->xmlToArray($xml_result);
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;
}
//将xml字符串转换为数组
public static function xmlToArray($xml)
{
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
/**
* 数据签名
* @param $data
* @return string
*/
private function sign($data, $key)
{
ksort($data);
$string1 = "";
foreach ($data as $k => $v) {
if ($v && trim($v) != '') {
$string1 .= "$k=$v&";
}
}
$stringSignTemp = $string1 . "key=" . $key;
$sign = strtoupper(md5($stringSignTemp));
return $sign;
}
/**
* 随机字符串
* @param int $length
* @return string
*/
public function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$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]
*/
public function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array())
{
$isdir = $_SERVER['DOCUMENT_ROOT'] . "/app/check/"; //证书位置;绝对路径
$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, $isdir . 'apiclient_cert.pem'); //证书位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); //CURLOPT_SSLKEY中规定的私钥的加密类型
curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem'); //证书位置
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, $xmldata); //全部数据使用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;
}
}