function createNoncestr($length =32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {
            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
        }
        return $str;
    }
 
 
    function unicode() {
        $str = uniqid(mt_rand(),1);
        $str=sha1($str);
        return md5($str);
    }
    function arraytoxml($data){
        $str='<xml>';
        foreach($data as $k=>$v) {
            $str.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $str.='</xml>';
        return $str;
    }
    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;
    }
 
    function curl($param="",$url) {
 
        $rootPath  = $_SERVER['DOCUMENT_ROOT'] . "/wxpay/cert/";//证书位置;绝对路径
        $postUrl = $url;
        $curlPost = $param;
        $ch = curl_init();                                      //初始化curl
        curl_setopt($ch, CURLOPT_URL,$postUrl);                 //抓取指定网页
        curl_setopt($ch, CURLOPT_HEADER, 0);                    //设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1);                      //post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);           // 增加 HTTP Header(头)里的字段
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        // 终止从服务端进行验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch,CURLOPT_SSLCERT,$rootPath .'apiclient_cert.pem'); //这个是证书的位置绝对路径
        curl_setopt($ch,CURLOPT_SSLKEY,$rootPath .'apiclient_key.pem'); //这个也是证书的位置绝对路径
        $data = curl_exec($ch);                                 //运行curl
        curl_close($ch);
        return $data;
    }
 
    /*
    $amount 发送的金额(分)目前发送金额不能少于1元
    $re_openid, 发送人的 openid
    $desc  //  企业付款描述信息 (必填)
    $check_name    收款用户姓名 (选填)
    */
    function sendMoney($amount,$re_openid,$desc='测试',$check_name=''){
 
        $amount = 0.3;  
        $appid = 'xxxxxxxxxxx';
        $mchid = 'xxxxxxxx';
        $key = 'xxxxxxxxxx';
        $total_amount = (100) * $amount;
 
        $data=array(
            'mch_appid'=>$appid,//商户账号appid
            'mchid'=> $mchid,//商户号
            'nonce_str'=>$this->createNoncestr(),//随机字符串
            'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商户订单号
            'openid'=> $re_openid,//用户openid
            'check_name'=>'NO_CHECK',//校验用户姓名选项,
            //'re_user_name'=> $check_name,//收款用户姓名
            'amount'=>$total_amount,//金额
            'desc'=> $desc,//企业付款描述信息
            'spbill_create_ip'=> '47.114.141.234',//发起付款请求Ip地址
        );
        $secrect_key=$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($xml,$url);
        $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
 
        echo '<Pre>';
        var_dump($responseObj);
        // 返回状态码 return_code 是通信标识,非交易标识,值为SUCCESS/FAIL,交易是否成功需要查看result_code来判断
        if($responseObj->return_code == 'SUCCESS' && $responseObj->result_code == 'SUCCESS'){
            return true;
        }else{
            return false;
        }
    }

成功和失败返回结果responseObj输出如下:

object(SimpleXMLElement)#30 (9) {
  ["return_code"]=>
  string(7) "SUCCESS"
  ["return_msg"]=>
  object(SimpleXMLElement)#31 (0) {
  }
  ["mch_appid"]=>
  string(18) "mch_appid"
  ["mchid"]=>
  string(10) "mchid"
  ["nonce_str"]=>
  string(32) "tcbl3f4h5wqry3cwy2cyuw2h9dzleujx"
  ["result_code"]=>
  string(7) "SUCCESS"
  ["partner_trade_no"]=>
  string(18) "222222222222222222222"
  ["payment_no"]=>
  string(32) "101011358111111111111111"
  ["payment_time"]=>
  string(19) "2021-03-31 21:55:42"
}
 
 
object(SimpleXMLElement)#30 (7) {
  ["return_code"]=>
  string(7) "SUCCESS"
  ["return_msg"]=>
  string(12) "支付失败"
  ["mch_appid"]=>
  string(18) "mch_appid"
  ["mchid"]=>
  string(10) "mchid"
  ["result_code"]=>
  string(4) "FAIL"
  ["err_code"]=>
  string(12) "AMOUNT_LIMIT"
  ["err_code_des"]=>
  string(80) "付款金额超出限制。低于最小金额0.30元或累计超过5000.00元。"
}

发表评论

邮箱地址不会被公开。 必填项已用*标注