PHP实现微信开发中提现功能(企业付款到用户零钱)

xiaoxiao2025-04-17  12

一.实现该功能目的

    这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现;

 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1;

 注意事项:商户打款时是从商户可用余额中减钱,所以确保商户可用余额充足,同时注意官方文档中的付款规则;

二.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;         }     }

 

三.补充

关于具体签名算法,可参考微信官方文档;

简单示范签名算法:

 

//将要发送的数据整理为$data

ksort($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='<xml>';     foreach($data as $k=>$v) {         $str.='<'.$k.'>'.$v.'</'.$k.'>';     }     $str.='</xml>';     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; }

 

 

 

pulic

 

 

 

 

 

以上是全部代码,不懂的可加我微信问我:1632282572

转载请注明原文地址: https://www.6miu.com/read-5028458.html

最新回复(0)