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_Flame(Version:Progress)的原代码
Oct 09 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
基于PHP文件操作的详解
Jun 05 PHP
基于header的一些常用指令详解
Jun 06 PHP
关于js与php互相传值的介绍
Jun 25 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
PHP与SQL语句写一句话木马总结
Oct 11 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
队列在编程中的实际应用(php)
2010/09/04 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python求离散序列导数的示例
2019/07/10 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
单位门卫岗位职责
2013/12/20 职场文书
社区矫正工作方案
2014/06/04 职场文书
学校宣传标语
2014/06/18 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
就业推荐表导师评语
2014/12/31 职场文书
2015年母亲节寄语
2015/03/23 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
python基础学习之递归函数知识总结
2021/05/26 Python