微信支付之企业付款到零钱

public function pay_to_change($orderid,$openid,$amount){
		$appid = xxx;//商户账号appid
        $secret = xxx;//appsecret
        $mch_id = xxx;//商户号
        $key = xxx;//支付密钥
             
        $arr = array();
        $arr['mch_appid'] = $appid;
        $arr['mchid'] = $mch_id;
        $arr['nonce_str'] = $this->createNoncestr();//随机字符串,不长于32位
        $arr['partner_trade_no'] = $orderid;//商户自定义订单号
        $arr['openid'] = $openid;
        $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
		$money = $amount * 100;
        $arr['amount'] = $money;//付款金额,单位为分
        $arr['desc'] = '"积分提现"';//描述信息
        $arr['spbill_create_ip'] = xxx; //服务器的ip

        //封装的关于签名的算法
		//作用:生成签名
        foreach ($arr as $k => $v) {
            $Parameters[$k] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //签名步骤二:在string后加入KEY
        $String = $String . "&key=" . $key;
        //签名步骤三:MD5加密
        $String = md5($String);
        //签名步骤四:所有字符转为大写
        $arr['sign'] = strtoupper($String);
    

        $var = $this->arrayToXml($arr);  //数组转xml
        $xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', $var, 30, array(), 1);

        $rdata = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);

        $return_code = (string)$rdata->return_code;
        $result_code = (string)$rdata->result_code;
        $return_code = trim(strtoupper($return_code));
        $result_code = trim(strtoupper($result_code));
        if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
            $data = array(
				'code' => 200,
				'message' => 'success'
			);
        } else {
            $des = (string)$rdata->err_code_des;
            $data = array(
                'code' => -1,
                'message' => $des,
            );
        }
        return $data;
	}
    //curl函数
    public function curl_post_ssl($url, $vars, $second = 30, $aHeader = array()){
        $isdir = "/cert/";//证书位置,绝对路径
        $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, $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;			
        }
    }
	
	//数组转换成xml
    public function arrayToXml($arr) {
        $xml = "<root>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</root>";
        return $xml;
    }


    //xml转换成数组
    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;
    }

    //作用:产生随机字符串,不长于32位
    public 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;
    }



    ///作用:格式化参数,签名过程需要使用
    public function formatBizQueryParaMap($paraMap, $urlencode) {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if ($urlencode) {
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "&";
        }
        $reqPar;
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值