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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。