PHP中怎么实现微信提现功能
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,PHP中怎么实现微信提现功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。封装提现的方法function tixian($money){
千家信息网最后更新 2026年11月02日PHP中怎么实现微信提现功能
PHP中怎么实现微信提现功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
封装提现的方法
function tixian($money){ $appid = "################";//商户账号appid $secret = "##########";//api密码 $mch_id = "#######";//商户号 $mch_no = "#######"; $openid="123456789";//授权用户openid $arr = array(); $arr['mch_appid'] = $appid; $arr['mchid'] = $mch_id; $arr['nonce_str'] = ugv::randomid(20);//随机字符串,不长于32位 $arr['partner_trade_no'] = '1298016501' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号 $arr['openid'] = $openid; $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证 $arr['amount'] = $money;//付款金额,单位为分 $desc = "###提现"; $arr['desc'] = $desc;//描述信息 $arr['spbill_create_ip'] = '192.168.0.1';//获取服务器的ip //封装的关于签名的算法 $notify = new Notify_pub(); $notify->weixin_app_config = array(); $notify->weixin_app_config['KEY'] = $mch_no; $arr['sign'] = $notify->getSign($arr);//签名 $var = $notify->arrayToXml($arr); $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') { $isrr = array( 'con'=>'ok', 'error' => 0, ); } else { $returnmsg = (string)$rdata->return_msg; $isrr = array( 'error' => 1, 'errmsg' => $returnmsg, ); } return json_encode($isrr);}用到的curl_post_ssl()
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; }}关于具体签名算法,可参考微信官方文档;
简单示范签名算法:
//将要发送的数据整理为$dataksort($data);//排序//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串$str='';foreach($data as $k=>$v) { $str.=$k.'='.$v.'&';}//拼接API密钥$str.='key='.$secrect;$data['sign']=md5($str);//加密将数组转换成xml格式(简单方法):
//遍历数组方法function arraytoxml($data){ $str=''; foreach($data as $k=>$v) { $str.='<'.$k.'>'.$v.''.$k.'>'; } $str.=' '; return $str;}将xml格式转换为数组:
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;}下面来看看ThinkPHP5封装的提现类。
state=md5(uniqid(rand(), TRUE)); $this->amount=I('amount');//设置POST过来钱数 $this->order_sn=rand(100,999).date('YmdHis'); //随机数可以作为单号 $this->openid= I('openid'); //设置获取POST过来用户的OPENID $user_id = I('user_id'); $this->app_id=$this->app_id1; $this->app_secret=$this->app_secret1; $this->apikey=$this->apikey1; $this->mchid=$this->mchid1; $xml=$this->tiXianAction(); $result=simplexml_load_string($xml); if($result->return_code=='SUCCESS' && $result->result_code=='SUCCESS') { $cash = D('cash'); $data['user_id'] = $user_id; $data['amount'] = $this->amount; $res = $cash->where('user_id="'.$user_id.'"')->find(); if($res){ $res2 = $cash->where('user_id="'.$user_id.'"')->setInc('amount',$this->amount); $res4 = D('member')->where('user_id="'.$user_id.'"')->setDec('user_balance',$this->amount); }else{ $res3 = $cash->add($data); } $output = array('code' => 1, 'data' => $result->result_code, 'info' => '提现成功'); exit(json_encode($output)); }else{ $output = array('code' => 2, 'data' => $xml, 'info' => '提现失败'); exit(json_encode($output)); } } /** * 提现接口操作,控制器调用 * @param $openid 用户openid 唯一标示 * @return */ //提现接口操作 public function tiXianAction(){ //获取xml数据 $data=$this->getdataXml($this->openid); $ch = curl_init (); //接口地址 $MENU_URL="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; curl_setopt ( $ch, CURLOPT_URL, $MENU_URL ); curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); 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, 'C:\web\www\Home\wx_pay\apiclient_cert.pem'); //证书这块大家把文件放到哪都行、 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY, 'C:\web\www\Home\wx_pay\apiclient_key.pem');//注意证书名字千万别写错、 //$zs1=dirname(dirname(__FILE__)).'\wx_pay\apiclient_cert.pem'; //$zs2=dirname(dirname(__FILE__)).'\wx_pay\apiclient_key.pem'; //show_bug($zs1); //curl_setopt($ch,CURLOPT_SSLCERT,$zs1); //curl_setopt($ch,CURLOPT_SSLKEY,$zs2); // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; // Windows NT 5.0)'); //curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); $info = curl_exec ( $ch ); //返回结果 if($info){ curl_close($ch); return $info; } else { $error = curl_errno($ch); curl_close($ch); return "curl出错,错误码:$error"; } } /** * 获取数据封装为数组 * @param $openid 用户openid 唯一标示 * @return xml */ private function getdataXml($openid){ //封装成数据 $dataArr=array( 'amount'=>$this->amount*100,//金额(以分为单位,必须大于100) 'check_name'=>'NO_CHECK',//校验用户姓名选项,NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) 'desc'=>'提现',//描述 'mch_appid'=>$this->app_id, 'mchid'=>$this->mchid,//商户号 'nonce_str'=>rand(100000, 999999),//不长于32位的随机数 'openid'=>$openid,//用户唯一标识 'partner_trade_no'=>$this->order_sn,//商户订单号 're_user_name'=>'',//用户姓名,check_name为NO_CHECK时为可选项 'spbill_create_ip'=>$_SERVER["REMOTE_ADDR"],//服务器ip ); //获取签名 $sign=$this->getSign($dataArr); //xml数据 $data=" ".$dataArr['mch_appid']." ".$dataArr['mchid']." ".$dataArr['nonce_str']." ".$dataArr['partner_trade_no']." ".$dataArr['openid']." ".$dataArr['check_name']." ".$dataArr['re_user_name']." ".$dataArr['amount']." ".$dataArr['desc']." ".$dataArr['spbill_create_ip']." ".$sign." "; return $data; } /** * 作用:格式化参数,签名过程需要使用 */ private function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if($v){ if($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar=NULL; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } /** * 作用:生成签名 */ private function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //echo '【string1】'.$String.''; //签名步骤二:在string后加入KEY $String = $String."&key=".$this->apikey; //echo "【string2】".$String.""; //签名步骤三:MD5加密 $String = md5($String); //echo "【string3】 ".$String.""; //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); //echo "【result】 ".$result_.""; return $result_; } //----------- private function http($url, $method='POST', $postfields = null, $headers = array()) { header("Content-Type:text/html;charset=utf-8"); $ch = curl_init(); /* Curl settings */ curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, ""); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_TIMEOUT, 30); switch ($method){ case 'POST': curl_setopt($ch,CURLOPT_POST, true); break; } curl_setopt($ch, CURLOPT_HTTPHEADER,$headers); curl_setopt($ch, CURLINFO_HEADER_OUT, true); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //返回请求状态码 curl_close($ch); return array($http_code, $response); }}看完上述内容,你们掌握PHP中怎么实现微信提现功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
用户
证书
姓名
数据
商户
方法
封装
字符
数组
格式
步骤
验证
位置
字符串
实名
接口
算法
加密
服务
认证
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天津市摩尔互联网科技
广州淘业互联网络科技
国智互联网科技
科技与互联网发展
互联网 科技创业
小马过河互联网科技
睿民互联网科技
郑州华宇互联网科技
银川新华互联网科技职业技术培训学校图片
彤创互联网科技有限公司
宝灵互联网科技有限公司
新兴科技互联网创新大赛颁奖典礼
互联网科技与大数据专业
元气玛特互联网科技公司是外包吗
互联网公司高科技产品
广州百诚互联网科技有限公司官网
艺电能源互联网科技有限公司招聘
好易买互联网科技
互联网科技大会大佬
安徽九吞吴互联网科技有限公司
华服互联网科技怎么样
互联网电商科技
智网互联网科技
互联网科技公司招聘
互联网之后的科技是什么
字节跳动和互联网科技
团飞科技与伯堂互联网服务平台
广州富喜互联网络科技
互联网金融金融科技
互联网高科技绘画