php实现微信公众号企业转账功能


Posted in PHP onOctober 01, 2018

企业付款提供由商户直接付钱至用户微信零钱的能力,支持平台操作及接口调用两种方式,资金到账速度快,使用及查询方便。主要用来解决合理的商户对用户付款需求,比如:保险理赔、彩票兑换等等。

特点

  • 发起方式灵活,可通过页面或接口发起
  • 微信消息触达,用户及时获知入账详情
  • 支持实名校验,判断收款人真实身份
  • 通过openid即可实现付款,无需用户敏感隐私信息
  • 到账速度快,在发起后,用户可在几分钟内收到付款

企业转账需要到微信商户平台=》产品中心=》企业付款到零钱,开启此功能

php实现微信公众号企业转账功能

下面是程序截图:

第一步:设置配置参数

$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$pars = array();
$pars['mch_appid'] =$this->module['config']['appid'];
$pars['mchid']=$this->module['config']['mchid'];
$pars['nonce_str'] =random(32);
$pars['partner_trade_no'] =time().random(3,1);
$pars['openid'] =$openid;
$pars['check_name'] ='NO_CHECK' ;
//$pars['re_user_name'] ='' ;
$monet_finall = $price * 100;
$pars['amount'] =$monet_finall; //这里是折算成1%的所以要*100
$pars['desc'] ='您已成功提现 '.$price.' 现金';
$pars['spbill_create_ip'] =$this->module['config']['ip'];

ksort($pars, SORT_STRING);
$string1 = '';
foreach ($pars as $k => $v) {
  $string1 .= "{$k}={$v}&";
}

$string1 .= "key=".$this->module['config']['password'];
$pars['sign'] = strtoupper(md5($string1));
$xml = array2xml($pars);
$extras = array();
$extras['CURLOPT_CAINFO'] = ATTACHMENT_ROOT . '/withdraw/cert/rootca.pem.' . $_W['uniacid'];
$extras['CURLOPT_SSLCERT'] = ATTACHMENT_ROOT   . '/withdraw/cert/apiclient_cert.pem.' . $_W['uniacid'];
$extras['CURLOPT_SSLKEY'] = ATTACHMENT_ROOT . '/withdraw/cert/apiclient_key.pem.' . $_W['uniacid'];
$procResult = null;

第二步:CURL请求微信服务器

load()->func('communication');
$resp = ihttp_request($url, $xml, $extras);

其中ihttp_request函数内容是:

function ihttp_request($url, $post = '', $extra = array(), $timeout = 60) {
  $urlset = parse_url($url);
  if (empty($urlset['path'])) {
   $urlset['path'] = '/';
  }
  if (!empty($urlset['query'])) {
   $urlset['query'] = "?{$urlset['query']}";
  }
  if (empty($urlset['port'])) {
     }
  if (strexists($url, 'https://') && !extension_loaded('openssl')) {
   if (!extension_loaded("openssl")) {
     message('请开启您PHP环境的openssl');
   }
  }
  if (function_exists('curl_init') && function_exists('curl_exec')) {
   $ch = curl_init();
   if (!empty($extra['ip'])) {
     $extra['Host'] = $urlset['host'];
     $urlset['host'] = $extra['ip'];
     unset($extra['ip']);
   }
   curl_setopt($ch, CURLOPT_URL, $urlset['scheme'] . '://' . $urlset['host'] . ($urlset['port'] == '80' || empty($urlset['port']) ? '' : ':' . $urlset['port']) . $urlset['path'] . $urlset['query']);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_HEADER, 1);
   @curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
   if ($post) {
     if (is_array($post)) {
      $filepost = false;
            foreach ($post as $name => &$value) {
        if (version_compare(phpversion(), '5.6') >= 0 && substr($value, 0, 1) == '@') {
         $value = new CURLFile(ltrim($value, '@'));
        }
        if ((is_string($value) && substr($value, 0, 1) == '@') || (class_exists('CURLFile') && $value instanceof CURLFile)) {
         $filepost = true;
        }
      }
      if (!$filepost) {
        $post = http_build_query($post);
      }
     }
     curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
   }
   if (!empty($GLOBALS['_W']['config']['setting']['proxy'])) {
     $urls = parse_url($GLOBALS['_W']['config']['setting']['proxy']['host']);
     if (!empty($urls['host'])) {
      curl_setopt($ch, CURLOPT_PROXY, "{$urls['host']}:{$urls['port']}");
      $proxytype = 'CURLPROXY_' . strtoupper($urls['scheme']);
      if (!empty($urls['scheme']) && defined($proxytype)) {
        curl_setopt($ch, CURLOPT_PROXYTYPE, constant($proxytype));
      } else {
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
      }
      if (!empty($GLOBALS['_W']['config']['setting']['proxy']['auth'])) {
        curl_setopt($ch, CURLOPT_PROXYUSERPWD, $GLOBALS['_W']['config']['setting']['proxy']['auth']);
      }
     }
   }
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
   curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
   curl_setopt($ch, CURLOPT_SSLVERSION, 1);
   if (defined('CURL_SSLVERSION_TLSv1')) {
     curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
   }
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
   if (!empty($extra) && is_array($extra)) {
     $headers = array();
     foreach ($extra as $opt => $value) {
      if (strexists($opt, 'CURLOPT_')) {
        curl_setopt($ch, constant($opt), $value);
      } elseif (is_numeric($opt)) {
        curl_setopt($ch, $opt, $value);
      } else {
        $headers[] = "{$opt}: {$value}";
      }
     }
     if (!empty($headers)) {
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
     }
   }
   $data = curl_exec($ch);
   $status = curl_getinfo($ch);
   $errno = curl_errno($ch);
   $error = curl_error($ch);
   curl_close($ch);
   if ($errno || empty($data)) {
     return error(1, $error);
   } else {
     return ihttp_response_parse($data);
   }
  }
  $method = empty($post) ? 'GET' : 'POST';
  $fdata = "{$method} {$urlset['path']}{$urlset['query']} HTTP/1.1\r\n";
  $fdata .= "Host: {$urlset['host']}\r\n";
  if (function_exists('gzdecode')) {
   $fdata .= "Accept-Encoding: gzip, deflate\r\n";
  }
  $fdata .= "Connection: close\r\n";
  if (!empty($extra) && is_array($extra)) {
   foreach ($extra as $opt => $value) {
     if (!strexists($opt, 'CURLOPT_')) {
      $fdata .= "{$opt}: {$value}\r\n";
     }
   }
  }
  $body = '';
  if ($post) {
   if (is_array($post)) {
     $body = http_build_query($post);
   } else {
     $body = urlencode($post);
   }
   $fdata .= 'Content-Length: ' . strlen($body) . "\r\n\r\n{$body}";
  } else {
   $fdata .= "\r\n";
  }
  if ($urlset['scheme'] == 'https') {
   $fp = fsockopen('ssl://' . $urlset['host'], $urlset['port'], $errno, $error);
  } else {
   $fp = fsockopen($urlset['host'], $urlset['port'], $errno, $error);
  }
  stream_set_blocking($fp, true);
  stream_set_timeout($fp, $timeout);
  if (!$fp) {
   return error(1, $error);
  } else {
   fwrite($fp, $fdata);
   $content = '';
   while (!feof($fp))
     $content .= fgets($fp, 512);
   fclose($fp);
   return ihttp_response_parse($content, true);
  }
}

第三步:解析分析微信服务器返回值并返回。

if (is_error($resp)) {
  $procResult = $resp;
} else {
  $arr=json_decode(json_encode((array) simplexml_load_string($resp['content'])), true);
  $xml = '<?xml version="1.0" encoding="utf-8"?>' . $resp['content'];
  $dom = new \DOMDocument();
  if ($dom->loadXML($xml)) {
    $xpath = new \DOMXPath($dom);
    $code = $xpath->evaluate('string(//xml/return_code)');
    $ret = $xpath->evaluate('string(//xml/result_code)');
    if (strtolower($code) == 'success' && strtolower($ret) == 'success') {
      $procResult = array('errno'=>0,'error'=>'success');;
    } else {
      $error = $xpath->evaluate('string(//xml/err_code_des)');
      $procResult = array('errno'=>-2,'error'=>$error);
    }
  } else {
    $procResult = array('errno'=>-1,'error'=>'未知错误');
  }
}

return $procResult;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP数据库开发知多少
Oct 09 PHP
PHP安全防范技巧分享
Nov 03 PHP
深入apache host的配置详解
Jun 09 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
php时间计算相关问题小结
May 09 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
PHP7 list() 函数修改
Mar 09 PHP
详解json在php中的应用
Sep 30 #PHP
php实现数组重复数字统计实例
Sep 30 #PHP
PHP APP微信提现接口代码
Sep 30 #PHP
PHP实现微信提现功能
Sep 30 #PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 #PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 #PHP
PHP使用函数用法详解
Sep 30 #PHP
You might like
超级简单的php+mysql留言本源码
2009/11/11 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
python实现清屏的方法
2015/04/30 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
python paramiko模块学习分享
2017/08/23 Python
python调用百度语音REST API
2018/08/30 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python字符串格式化方式解析
2019/10/19 Python
python 画图 图例自由定义方式
2020/04/17 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
技术总监个人的自我评价范文
2013/12/18 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
布达拉宫的导游词
2015/02/02 职场文书
财务会计岗位职责
2015/02/03 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python