dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13681|回复: 217

[功能实现] PHP实现企业微信付款代码类封装

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10740
    发表于 2018-11-13 23:33:47 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    一、封装微信企业付款类WeiXinPayToUser,如下图代码所示:
    [PHP] 纯文本查看 复制代码
    class WeixinPayToUser
    {
        /**
         * API 参数
         * @var array
         * 'mch_appid'         # 公众号APPID
         * 'mchid'             # 商户号
         * 'device_info'       # 设备号
         * 'nonce_str'         # 随机字符串
         * 'partner_trade_no'  # 商户订单号
         * 'openid'            # 收款用户openid
         * 'check_name'        # 校验用户姓名选项 针对实名认证的用户
         * 're_user_name'      # 收款用户姓名
         * 'amount'            # 付款金额
         * 'desc'              # 企业付款描述信息
         * 'spbill_create_ip'  # Ip地址
         * 'sign'              # 签名
         */
        public $parameters = [];
        public $SSLROOTCA_PATH='';
        public $SSLCERT_PATH='';
        public $SSLKEY_PATH='';
        public $appid='';
        public $secret='';
        public $mchid='';
        public $key='';//商户密钥
    
        public function __construct()
        {
    
            $this->url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
            $this->curl_timeout = 10;
            $this->SSLROOTCA_PATH=dirname(__FILE__).'/weixin/cert/rootca.pem';
            $this->SSLCERT_PATH=dirname(__FILE__).'/weixin/cert/apiclient_cert.pem';
            $this->SSLKEY_PATH=dirname(__FILE__).'/weixin/cert/apiclient_key.pem';
        }
    
        public function setParameter($key,$value){
            $this->parameters[$key]=$value;
        }
    
        function arrayToXml($arr,$dom=0,$item=0){
            if (!$dom){
                $dom = new DOMDocument("1.0");
            }
            if(!$item){
                $item = $dom->createElement("xml");
                $dom->appendChild($item);
            }
            foreach ($arr as $key=>$val){
                $itemx = $dom->createElement(is_string($key)?$key:"item");
                $item->appendChild($itemx);
                if (!is_array($val)){
                    $text = $dom->createTextNode($val);
                    $itemx->appendChild($text);
    
                }else {
                    $this->arrayToXml($val,$dom,$itemx);
                }
            }
            $dom->encoding = 'UTF-8'; // insert proper
            return $dom->saveXML();
        }
    
        public function getSign($paramArr){//print_r($paramArr);
            ksort($paramArr);
            $paramStr = http_build_query($paramArr);
            $paramStr=urldecode($paramStr);
            $param_temp=$paramStr.'&key='.$this->key;//echo $param_temp.'<br>';
            $signValue=strtoupper(md5($param_temp));//echo $signValue.'<br>';
            return $signValue;
    
        }
    
        /**
         * 生成请求xml数据
         * @return string
         */
        public function createXml()
        {
            $this->parameters['mch_appid'] = $this->appid;
            $this->parameters['mchid']     = $this->mchid;
           // $this->parameters['nonce_str'] = md5(time());
            $this->parameters['nonce_str'] = 'dddfff';
            $this->parameters['sign']      = $this->getSign($this->parameters);
            $a= $this->arrayToXml($this->parameters);
            //echo $a;
            return $a;
        }
    
        public function pay(){
            $xml=$this->createXml();
            $url=$this->url;
            return $this->postXmlSSLCurl($xml,$url,$second=30);
        }
    
        /**
         *     作用:使用证书,以post方式提交xml到对应的接口url
         */
        function postXmlSSLCurl($xml,$url,$second=30)
        {
    
            $ch = curl_init();
            //超时时间
            curl_setopt($ch,CURLOPT_TIMEOUT,$second);
            //这里设置代理,如果有的话
            //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
            //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);
            //设置header
            curl_setopt($ch,CURLOPT_HEADER,FALSE);
            //要求结果为字符串且输出到屏幕上
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
            //设置证书
            //curl_setopt($ch,CURLOPT_CAINFO, $this->SSLROOTCA_PATH);
            //使用证书:cert 与 key 分别属于两个.pem文件
            //默认格式为PEM,可以注释
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
            //默认格式为PEM,可以注释
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);
    
            //post提交方式
            curl_setopt($ch,CURLOPT_POST, true);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
            $data = curl_exec($ch);
            //返回结果
            if($data){
                curl_close($ch);
                return $data;
            }
            else {
                $error = curl_errno($ch);
                echo "curl出错,错误码:$error"."<br>";
                echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
                curl_close($ch);
                return false;
            }
        }
    
    
    }
    ?>



    二、调用WeiXinPayToUser,以下代码所示:
    [PHP] 纯文本查看 复制代码
    /**
         * 企业付款测试
         */
        public function payToUser()
        {
       
            $mchPay = new WeiXinPayToUser();
            // 用户openid
            $mchPay->setParameter('openid', 'oy2lbszskklaslEKThrzqEziKEBzqU');
            // 商户订单号
            $mchPay->setParameter('partner_trade_no', 'test-'.time());
            // 校验用户姓名选项
            $mchPay->setParameter('check_name', 'NO_CHECK');
            // 企业付款金额  单位为分
            $mchPay->setParameter('amount', 100);
            // 企业付款描述信息
            $mchPay->setParameter('desc', '开发测试');
            // 调用接口的机器IP地址  自定义
            $mchPay->setParameter('spbill_create_ip', '127.0.0.1'); # getClientIp()
            // 收款用户姓名
            // $mchPay->setParameter('re_user_name', 'Max wen');
            // 设备信息
            // $mchPay->setParameter('device_info', 'dev_server');
    
            $response = $mchPay->postXmlSSL();
            if( !empty($response) ) {
                $data = simplexml_load_string($response, null, LIBXML_NOCDATA);
                echo json_encode($data);
            }else{
                echo json_encode( array('return_code' => 'FAIL', 'return_msg' => 'transfers_接口出错', 'return_ext' => array()) );
            }
        }
    }



    回复

    使用道具 举报

    该用户从未签到

    20

    主题

    7880

    帖子

    986

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    986

    发表于 2018-11-14 00:07:06 | 显示全部楼层
    路过,学习下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    7985

    帖子

    1042

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1042

    发表于 2018-11-14 05:23:01 | 显示全部楼层
    支持一下:lol
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    7836

    帖子

    924

    积分

    技冠群雄

    Rank: 6Rank: 6

    积分
    924

    发表于 2018-11-14 09:02:27 | 显示全部楼层
    看帖回帖是美德!:lol
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    30

    主题

    7851

    帖子

    1002

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1002

    发表于 2018-11-14 09:43:58 | 显示全部楼层
    珍惜生命,果断回帖。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    7878

    帖子

    1075

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1075

    发表于 2018-11-14 09:48:45 | 显示全部楼层
    好好 学习了 确实不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22

    主题

    7969

    帖子

    917

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    917

    发表于 2018-11-14 10:28:20 | 显示全部楼层
    有道理。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    7567

    帖子

    1137

    积分

    技冠群雄

    Rank: 6Rank: 6

    积分
    1137

    发表于 2018-11-14 10:29:20 | 显示全部楼层
    好好 学习了 确实不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    7984

    帖子

    942

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    942

    发表于 2018-11-14 11:45:42 | 显示全部楼层
    看帖回帖是美德!:lol
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    49

    主题

    7865

    帖子

    940

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    940

    发表于 2018-11-14 18:58:00 | 显示全部楼层
    学习了,不错,讲的太有道理了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2024-12-25 12:27 , Processed in 0.152024 second(s), 42 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表