php实现微信企业号支付个人的方法详解


Posted in PHP onJuly 26, 2017

本文实例讲述了php实现微信企业号支付个人的方法。分享给大家供大家参考,具体如下:

导语:分销商,微商提现怎么提?

直接用微信支付。

实现如下:

微信支付配置

/*微信支付*/
  'PAY_WEIXIN'        => array(
    'appid'         => 'XXXX',
    'appsecret'       => 'XXXXXXX',
    'mchid'         => '1283301801',                        //商户号
    'key'          => 'zhudianbaodiandodozhudianbao0527',             //商户支付秘钥
    'apiclient_cert'    => 'Conf/cert/apiclient_cert.pem',               //商户证书apiclient_cert.pem
    'apiclient_key'     => 'Conf/cert/apiclient_key.pem',                //商户证书apiclient_key.pem
  )

arrayToXml

/**
* array转xml
*/
function arrayToXml($arr)
{
  $xml = "<xml>";
  foreach ($arr as $key=>$val)
  {
    if (is_numeric($val))
    {
        $xml.="<".$key.">".$val."</".$key.">";
    }
    else
    $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  }
  $xml.="</xml>";
  return $xml;
}

使用证书,以post方式提交xml到对应的接口url

/**
*  作用:使用证书,以post方式提交xml到对应的接口url
*/
function postXmlSSLCurl($xml, $url, $second, $cert, $key)
{
    $ch = curl_init();
    //超时时间
    curl_setopt($ch,CURLOPT_TIMEOUT,$second ? $second : $this->timeout);
    //这里设置代理,如果有的话
    //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);
    //设置证书
    //使用证书:cert 与 key 分别属于两个.pem文件
    //默认格式为PEM,可以注释
    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLCERT,$cert);
    //默认格式为PEM,可以注释
    curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLKEY, $key);
    //post提交方式
    curl_setopt($ch,CURLOPT_POST, true);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
    $data = curl_exec($ch);
    //返回结果
    if($data){
      curl_close($ch);
      return $this->xmlToArray($data);
    }
    else {
      $error = curl_errno($ch);
      echo "curl出错,错误码:$error"."<br>";
      curl_close($ch);
      return false;
    }
}

企业向个人付款

//企业向个人付款
public function payToUser($params, $key, $apicent_cert, $apiclient_key) {
    $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
    //检测必填参数
    if($params["partner_trade_no"] == null) {  //
      exit("退款申请接口中,缺少必填参数partner_trade_no!"."<br>");
    }elseif($params["openid"] == null){
      exit("退款申请接口中,缺少必填参数openid!"."<br>");
    }elseif($params["check_name"] == null){       //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
      exit("退款申请接口中,缺少必填参数check_name!"."<br>");
    }elseif(($params["check_name"] == 'FORCE_CHECK' or $params["check_name"] == 'OPTION_CHECK') && ($params["re_user_name"] == null)){ //收款用户真实姓名。
      exit("退款申请接口中,缺少必填参数re_user_name!"."<br>");
    }elseif($params["amount"] == null){
      exit("退款申请接口中,缺少必填参数amount!"."<br>");
    }elseif($params["desc"] == null){
      exit("退款申请接口中,缺少必填参数desc!"."<br>");
    }
    $params["mch_appid"] = $this->appid;//公众账号ID
    $params["mchid"] = $this->mchid;//商户号
    $params["nonce_str"] = $this->createNoncestr();//随机字符串
    $params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'] == '::1' ? '192.127.1.1' : $_SERVER['REMOTE_ADDR'];//获取IP
    $params["sign"] = $this->getSign($params, $key);//签名
    $xml = $this->arrayToXml($params);
    return $this->postXmlSSLCurl($xml, $url, false, $apicent_cert, $apiclient_key);
}

企业付款

private function _enterprisePay($number, $member_id, $amount, $desc)
{
    // 获取openid
    $wxuser_id = M('Member')->where(array('id' => $member_id))->getField('wxuser_id');
    $openid  = M('Wxuser')->where(array('id' => $wxuser_id))->getField('openid');
    $pay = C('PAY_WEIXIN');
    import('@.Action.WxDevelop');
    $enterprise = new WxEnterprise($pay['appid'], $pay['appsecret'], $pay['mchid']);
    $params = array(
      'partner_trade_no' => $number,
      'openid' => $openid,
      'check_name' => 'NO_CHECK',
      'amount' => $amount, // 总计
      'desc' => $desc,
    );
    $result = $enterprise->payToUser($params, $pay['key'], $pay['apiclient_cert'], $pay['apiclient_key']);
    return $result;
}

处理分销商提现

private function _handle($truename, $price) { // 处理分销商提现
    $withdrawid = date("ymdHis") . strval(rand(1000, 9999));
    $data = array('withdrawid' => $withdrawid, 'store_id' => $this->store_id, 'member_id' => $this->member_id, 'truename' => $truename, 'price' => $price, 'addtime' => time());
    //免审核
    if ($price >= C('withdraw_uncheck_value')) {
      $data['need_check'] = 0;
      $data['status'] = 1;
      if ($this->withdrawModel->add($data)) {
        $result = $this->_enterprisePay($withdrawid, $this->member_id, $price * 100, '分销商(' . $truename . ')提现');
        //遇到支付信息出错,转为需审核提现
        if ($result['return_code'] != 'SUCCESS') {
          $this->withdrawModel->where(array('withdrawid' => $withdrawid))->save(array('need_check' => 1, 'status' => 0));
          $this->assign('success', 2);
        }
        else {
          //设置微信交易号
          $this->withdrawModel->where(array('withdrawid' => $withdrawid))->save(array('payment_no' => $result['payment_no']));
          //增加佣金流水,待修复
          $data = array('store_id' => $this->store_id, 'user_type' => 2, 'user_id' => $this->shop_id, 'trade_type' => 2, 'trade_no' => $withdrawid, 'price' => -$price, 'status'=> 1, 'message' => $truename.'提现', 'addtime' => time());
          M('Twitter_log')->add($data);
          //减少相应可提佣金
          M('Member')->where(array('id' => $this->member_id))->setInc('money', -$price);
          $this->assign('success', 1);
          //发送佣金变动消息
          import('@.Action.Tmplmsg');
          $tmplmsg = new Tmplmsg();
          $tmplmsg->send(Tmplmsg::PRICE_CHANGE, $this->member_id, array('token' => $this->token, 'intro' => '分销佣金提现转出', 'price' => $price, 'business' => BUSINESS));
        }
      }
      else {
        $this->error('提现信息错误!');
      }
    }
    //需要审核
    else {
      $this->withdrawModel->add($data);
      $this->assign('success' , 2);
    }
}

提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款。

温馨提示:

◆ 给同一个实名用户付款,单笔单日限额2W/2W
◆ 给同一个非实名用户付款,单笔单日限额2000/2000
◆ 一个商户同一日付款总额限额100W
◆ 仅支持商户号已绑定的APPID;
◆ 针对付款的目标用户,已微信支付实名认证的用户可提供校验真实姓名的功能,未实名认证的用户无法校验,企业可根据自身业务的安全级别选择验证类型;
◆ 付款金额必须小于或等于商户当前可用余额的金额;
◆ 已付款的记录,企业可通过企业付款查询查看相应数据。

到账

付款资金将进入目标用户的零钱(微信-我-钱包-零钱)。微信支付将做零钱入账消息通知,零钱收支明细会展示相应记录。

温馨提示:

针对无零钱账户的历史客户端版本,资金将进入用户的红包账户,微信支付无消息通知用户,企业可选择自行触达用户。

接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

是否需要证书
请求需要双向证书。

数据示例:

<xml>
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<partner_trade_no>100000982014120919616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>OPTION_CHECK</check_name>
<re_user_name>张三</re_user_name>
<amount>100</amount>
<desc>节日快乐!</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml>

成功示例:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[]]></return_msg>
<mch_appid><![CDATA[wxec38b8ff840bd989]]></mch_appid>
<mchid><![CDATA[10013274]]></mchid>
<device_info><![CDATA[]]></device_info>
<nonce_str><![CDATA[lxuDzMnRjpcXzxLx0q]]></nonce_str>
<result_code><![CDATA[SUCCESS]]></result_code>
<partner_trade_no><![CDATA[10013574201505191526582441]]></partner_trade_no>
<payment_no><![CDATA[1000018301201505190181489473]]></payment_no>
<payment_time><![CDATA[2015-05-19 15:26:59]]></payment_time>
</xml>

错误示例:

<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[SYSTEMERROR]]></err_code>
<err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des>
</xml>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的FTP学习(三)
Oct 09 PHP
再次研究下cache_lite
Feb 14 PHP
php 随机排序广告的实现代码
May 09 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
使用PHP进行微信公众平台开发的示例
Aug 21 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
Dec 23 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
PHP CURL使用详解
Mar 21 PHP
Smarty模板配置实例简析
Jul 20 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 #PHP
浅谈Yii乐观锁的使用及原理
Jul 25 #PHP
PHP异常处理定义与使用方法分析
Jul 25 #PHP
PHP实现防盗链的方法分析
Jul 25 #PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 #PHP
php 删除指定文件夹的实例讲解
Jul 25 #PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 #PHP
You might like
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
关于PHP中Object对象的笔记分享
2011/06/28 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
Javascript的一种模块模式
2010/09/08 Javascript
xml转json的js代码
2012/08/28 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
vue.js实现简单购物车功能
2020/05/30 Javascript
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
网上蛋糕店创业计划书
2014/01/24 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
《四季》教学反思
2014/04/08 职场文书
安全标兵事迹材料
2014/08/17 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
德能勤绩工作总结
2015/08/11 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP