PHP实现微信提现(企业付款到零钱)
怎么开通企业付款到零钱?
有的商户号的产品中心是没有这个功能的,不过,该功能的pid(productid)是5,只要随便进去某一个产品,在地址栏把pid改为5。
即可进入该功能页面,进行开通,不过要满足条件。
用户提现代码:
//用户微信提现 privatefunctionwithdrawals_weixin($id){ $falg=M('withdrawals')->where(['id'=>$id])->find(); $openid=M('users')->where('user_id',$falg['user_id'])->value('openid'); $data['openid']=$openid; $data['pay_code']=$falg['id'].$falg['user_id']; $data['desc']='提现ID'.$falg['id']; if($falg['taxfee']>=$falg['money']){ returnarray('status'=>1,'msg'=>"提现额度必须大于手续费!"); }else{ $data['money']=bcsub($falg['money'],$falg['taxfee'],2); } include_oncePLUGIN_PATH."payment/weixin/weixin.class.php"; $weixin_obj=new\weixin(); $result=$weixin_obj->transfer($data); return$result; }
其中pay_code在商户号的提现功能是唯一的,所以为了防重放攻击,这个值千万不能用随机数,最好用ID,具有提现记录唯一。
提现逻辑代码:
//微信提现转账 functiontransfer($data){ header("Content-type:text/html;charset=utf-8"); //CA证书及支付信息 $wxchat['appid']=WxPayConfig::$appid; $wxchat['mchid']=WxPayConfig::$mchid; $wxchat['api_cert']=PLUGIN_PATH.'/payment/weixin/cert/apiclient_cert.pem'; $wxchat['api_key']=PLUGIN_PATH.'/payment/weixin/cert/apiclient_key.pem'; //$wxchat['api_ca']='/plugins/payment/weixin/cert/rootca.pem'; $webdata=array( 'mch_appid'=>$wxchat['appid'], 'mchid'=>$wxchat['mchid'], 'nonce_str'=>md5(time()), //'device_info'=>'1000', 'partner_trade_no'=>$data['pay_code'],//商户订单号,需要唯一 'openid'=>$data['openid'],//转账用户的openid 'check_name'=>'NO_CHECK',//OPTION_CHECK不强制校验真实姓名,FORCE_CHECK:强制NO_CHECK: //'re_user_name'=>'jorsh',//收款人用户姓名 'amount'=>$data['money']*100,//付款金额单位为分 'desc'=>$data['desc'], 'spbill_create_ip'=>request()->ip(), ); foreach($webdataas$k=>$v){ $tarr[]=$k.'='.$v; } sort($tarr); $sign=implode($tarr,'&'); $sign.='&key='.WxPayConfig::$key; $webdata['sign']=strtoupper(md5($sign)); $wget=$this->array2xml($webdata); $pay_url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $res=$this->http_post($pay_url,$wget,$wxchat); if(!$res){ returnarray('status'=>1,'msg'=>"Can'tconnecttheserver"); } $content=simplexml_load_string($res,'SimpleXMLElement',LIBXML_NOCDATA); if(strval($content->return_code)=='FAIL'){ returnarray('status'=>1,'msg'=>strval($content->return_msg)); } if(strval($content->result_code)=='FAIL'){ returnarray('status'=>1,'msg'=>strval($content->err_code),':'.strval($content->err_code_des)); } $rdata=array( 'mch_appid'=>strval($content->mch_appid), 'mchid'=>strval($content->mchid), 'device_info'=>strval($content->device_info), 'nonce_str'=>strval($content->nonce_str), 'result_code'=>strval($content->result_code), 'partner_trade_no'=>strval($content->partner_trade_no), 'payment_no'=>strval($content->payment_no), 'payment_time'=>strval($content->payment_time), ); return$rdata; }
其中 PLUGIN_PATH是一个常量
define('PLUGIN_PATH',__DIR__.'/plugins/');
定义插件目录
/** *将一个数组转换为XML结构的字符串 *@paramarray$arr要转换的数组 *@paramint$level节点层级,1为Root. *@returnstringXML结构的字符串 */ functionarray2xml($arr,$level=1){ $s=$level==1?"":''; foreach($arras$tagname=>$value){ if(is_numeric($tagname)){ $tagname=$value['TagName']; unset($value['TagName']); } if(!is_array($value)){ $s.="<{$tagname}>".(!is_numeric($value)?'':'')."{$tagname}>"; }else{ $s.="<{$tagname}>".$this->array2xml($value,$level+1)."{$tagname}>"; } } $s=preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/",'',$s); return$level==1?$s." ":$s; } functionhttp_post($url,$param,$wxchat){ $oCurl=curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($oCurl,CURLOPT_SSL_VERIFYHOST,FALSE); } if(is_string($param)){ $strPOST=$param; }else{ $aPOST=array(); foreach($paramas$key=>$val){ $aPOST[]=$key."=".urlencode($val); } $strPOST=join("&",$aPOST); } curl_setopt($oCurl,CURLOPT_URL,$url); curl_setopt($oCurl,CURLOPT_RETURNTRANSFER,1); curl_setopt($oCurl,CURLOPT_POST,true); curl_setopt($oCurl,CURLOPT_POSTFIELDS,$strPOST); if($wxchat){ curl_setopt($oCurl,CURLOPT_SSLCERT,$wxchat['api_cert']); curl_setopt($oCurl,CURLOPT_SSLKEY,$wxchat['api_key']); curl_setopt($oCurl,CURLOPT_CAINFO,$wxchat['api_ca']); } $sContent=curl_exec($oCurl); $aStatus=curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return$sContent; }else{ returnfalse; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。