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 相关文章推荐
实用函数8
Nov 08 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
PHP文件上传操作实例详解
Sep 27 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
php微信公众号开发之图片回复
Oct 20 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 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 获取远程文件内容的函数代码
2010/03/24 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
Destoon实现多表查询示例
2014/08/21 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
php实现异步数据调用的方法
2015/12/24 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
github配置使用指南
2014/11/18 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
python抓取文件夹的所有文件
2018/02/27 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
python实现静态服务器
2019/09/05 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Python 实现简单的客户端认证
2020/07/29 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
客户表扬信范文
2014/01/10 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
孔子观后感
2015/06/08 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android