微信提现到零钱最新方法

public function transfer($openid, $trade_no, $money, $desc='备注说明')
{
    $money = (int)($money * 100);
    $config = Config('wechat_pay');
    $post_data = [
        "appid" => $config['app_id'],//appid
        "out_batch_no" => $trade_no,//商家批次单号
        "batch_name" => $desc,//批次名称
        "batch_remark" => $desc,//批次备注
        "total_amount" => $money,// 转账金额单位为“分”
        "total_num" => 1, // 转账总笔数
        //此处可以多笔提现  组合二维数组放到transfer_detail_list即可   我这里单笔操作,写死了
        "transfer_detail_list" => [
            [
                'out_detail_no' => $trade_no,
                'transfer_amount' => $money,
                'transfer_remark' => $desc,
                'openid' => $openid,
            ]
        ]
    ];
    $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
    $result = $this->wx_post($url, json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE));
    $result = json_decode($result, true);
    if (isset($result['prepay_id'])) {
        return $result['prepay_id'];
    }
    return $result;
}


/**post请求
 * @param $url
 * @param $param
 * @return bool|string
 */
private function wx_post($url, $param)
{
    $authorization = $this->getV3Sign($url, "POST", $param);
    $curl = curl_init();
    $headers = [
        'Authorization:' . $authorization,
        'Accept:application/json',
        'Content-Type:application/json;charset=utf-8',
        'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    ];
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
    curl_setopt($curl, CURLOPT_POST, true);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
}

/**
 * 微信提现V3签名
 * @param $url
 * @param $http_method
 * @param $body
 * @return string
 */
private function getV3Sign($url, $http_method, $body)
{
    $pay_data = Config('wechat_pay');
    $nonce = strtoupper($this->createNonceStr(32));
    $timestamp = time();
    $url_parts = parse_url($url);
    $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
    $sslKeyPath = $pay_data['key_path'];
    //拼接参数
    $message = $http_method . "\n" .
        $canonical_url . "\n" .
        $timestamp . "\n" .
        $nonce . "\n" .
        $body . "\n";
    $private_key = $this->getPrivateKey($sslKeyPath);
    openssl_sign($message, $raw_sign, $private_key, 'sha256WithRSAEncryption');
    $sign   = base64_encode($raw_sign);
    $token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%s",serial_no="%s",signature="%s"',
        $pay_data['mch_id'],
        $nonce,
        $timestamp,
        $pay_data['serial_no'],
        $sign);
    return $token;
}

/**
 * 生成随机32位字符串
 * @param $length
 * @return string
 */
public function createNonceStr($length = 16) { //生成随机16个字符的字符串
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
}

/**
 * 获取私钥
 * @param $filepath
 * @return false|resource
 */
private function getPrivateKey($filepath = '')
{
    $pay_data = \think\Config::get('wechat_pay');
    if (empty($filepath)) {
        //私钥位置
        $filepath = $pay_data['key_path'];
    }
    return openssl_get_privatekey(file_get_contents($filepath));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值