企业付款到用户零钱

商户号(或同主体其他非服务商商户号)已入驻90日
商户号(或同主体其他非服务商商户号)有30天连续正常交易
登录微信支付商户平台-产品中心,开通企业付款。

企业付款到用户零钱 /**
* 企业支付(向微信发起企业支付到零钱的请求)
* @param string $openid 用户openID
* @param string $trade_no 单号
* @param string $money 金额(单位分)
* @param string $desc 描述
* @param string appidappid@returnstringXML/publicfunctiontxFunc(appid 协会appid * @return string XML 结构的字符串 **/ public function txFunc(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;
    }
}
上一篇:libcurl第四课 Http Basic Auth认证使用


下一篇:libcurl第三课 HTTP获取天气信息