//企业提现 public function actionIndex() { if (\Yii::$app->request->isPost){ $data = array( 'mch_appid' =>'',//小程序appid 'mchid' => '',//微信支付商户号 'nonce_str' => $this->getNonceStr(), //随机字符串 'partner_trade_no' => "1552283579517745", //商户订单号,需要唯一 'openid' => '',用户openid 'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK: 'amount' => 1 * 100, //付款金额单位为分 最少金额必须为1元 'desc' => "提现测试", 'spbill_create_ip' => "",服务器ip //'re_user_name' => 'jorsh', //收款人用户姓名 *选填 //'device_info' => '1000', //设备号 *选填 ); $key = ""; 商户后台生成key //生成签名 $data['sign']=$this->getSign($data,$key); //构造XML数据(数据包要以xml格式进行发送) $xmldata = $this->arrToXml($data); //请求url $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //发送post请求 $res = $this->curl_post_ssl($url,$xmldata); $result = $this->xmlToArray($res); print_r($result);die; return $res; }else{ return $this->isPost(); } } /** * 随机字符串 * @param int $length * @return string */ private 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; } /** * 签名 * @param $data * @return string */ private function getSign($obj,$key){ //生成签名 foreach ($obj as $k=>$v){ $copyParameters[$k]=$v; } //步骤一:按字典排序参数 $string=$this->formatBizQueryParaMap($copyParameters,false); //步骤二:在string后面加key $string.='key='.$key; //步骤三:md5加密 $string=md5($string); //步骤四:转大小写 return strtoupper($string); } private function formatBizQueryParaMap($paraMap,$urlencode){ //格式化参数 $buff=""; ksort($paraMap); foreach ($paraMap as $k=>$v){ if($urlencode){ $v=urlencode($v); } $buff.=$k.'='.$v.'&'; } return $buff; } /** * 数组转XML * @param $data * @return string */ private function arrToXml($data) { $xml = "<xml>"; // 遍历组合 foreach ($data as $k=>$v){ $xml.='<'.$k.'>'.$v.'</'.$k.'>'; } $xml .= '</xml>'; return $xml; } /** * [curl_post_ssl 发送curl_post数据] * @param [type] $url [发送地址] * @param [type] $param [发送文件格式] * @return [type] [description] */ public function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){ $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误 curl_setopt($ch,CURLOPT_SSLCERT,'/var/www/html/carWash/cert/apiclient_cert.pem'); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY,'/var/www/html/carWash/cert/apiclient_key.pem'); if( count($aHeader) >= 1 ){ curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); } curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata); $data = curl_exec($ch); if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "call faild, errorCode:$error\n"; die(); curl_close($ch); return false; } } /** * XML转数组 * @param string * return $data * */ private function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
企业提现需主要注意的是:
一:必须要将商户后台的CA证书下载到本地并且传到自己服务器上 ,并且以绝对路径去访问apiclient_cert.pem apiclient_key.pem两个文件
二: 拼接sign签名需拼接上商户key 签名生成请根据微信官方文档