一、封装微信企业付款类WeiXinPayToUser,如下图代码所示:

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,如下图所示:

 /**
* 企业付款测试
*/
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()) );
}
}
}

PHP实现微信企业付款的更多相关文章

  1. 关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案

     前言: 最近做了一个通过调用微信企业付款到用户零钱的功能,真的挺奇怪的,在我本地调试的时候都没有问题,但是当我发布到服务上的时候却一直无法读取到我的证书信息.读取的代码如下,使用的是微信官方文档提供 ...

  2. thinkphp.2 thinkphp5微信支付 微信公众号支付 thinkphp 微信扫码支付 thinkphp 微信企业付款5

    前面已经跑通了微信支付的流程,接下来吧微信支付和微信企业付款接入到thinkphp中,版本是3.2 把微信支付类.企业付款类整合到一起放到第三方类库,这里我把微信支付帮助类和企业付款类放到同一个文件了 ...

  3. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...

  4. PHP实现微信企业付款到个人零钱步骤

    微信支付企业付款到零钱功能应用广泛,比如微信红包奖励,业务结算等.通过企业向个人付款,付款资金将直接进入用户微信零钱. 一 开通条件 ​ 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的 ...

  5. 微信企业付款获取RSA

    package com.hentica.app.test.wx; import com.plant.app.modules.pay.wxpay.config.WxpayConfig; import o ...

  6. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)

    这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...

  7. 微信分账功能与微信支付企业付款相关内容详解(payjs版)

    PAYJS开通微信分账功能以来,有很多同学咨询相关情况.很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能.这里就介绍下微信分账的具体相关内容,可以完美解决问题. 一.什么是微信分账? ...

  8. PHP微信商户支付企业付款到零钱功能

    一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...

  9. C#开发微信门户及应用(35)--微信支付之企业付款封装操作

    在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...

随机推荐

  1. 【转】什么是.Net以及.Net的基本语法

    什么是.Net? 1. 通常意义所说的.net有5个组成部分,但最主要的部分是.NET Framework, .NET Framework实际上是运行在Windows操作系统的一个应用程序,一个可供二 ...

  2. Dapper, 批量插入,批量更新, 以及in, like

    1. 批量插入 public async Task CreateBusinessItemAsync(IEnumerable<BusinessItemsEntity> businessIte ...

  3. Java开发笔记(七十五)异常的处理:扔出与捕捉

    前面介绍的几种异常(不包含错误),编码的时候没认真看还发现不了,直到程序运行到特定的代码跑不下去了,程序员才会恍然大悟:原来这里的代码逻辑有问题.像这些在运行的时候才暴露出来的异常,又被称作“运行时异 ...

  4. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  5. HTML5跳转页面并传值以及localStorage的用法

    1.首先,你得在那个页面把数据存入localStorage中吧.这个是必须的! localStorage.setItem("user",JSON.stringify(data.al ...

  6. ps快捷键(有道云笔记翻出来以前的存货)

    打开       ctrl+o 关闭       ctrl+w 全选       ctrl+a 新建画布      ctrl+n 取消选区      ctrl+d 标尺       ctrl+r 虚线 ...

  7. WEB前端开发记录PS常见操作

    1.相邻2个层合并的快捷键方法:先选择上面的一个层,再按ctrl+e. 2.合并一个组内的多个层或组:在该组单击右键,选择“转换为智能对象”,然后可对其进行其它操作,比如:截取该组的为一张图片:ctr ...

  8. iOS----------弹窗动画

    - (void)animationAlert:(UIView *)view { CAKeyframeAnimation *popAnimation = [CAKeyframeAnimation ani ...

  9. Scrapped or attached views may not be recycled

    在使用recycleView的时候出现了错误Scrapped or attached views may not be recycled 原因: view没有被recycled,recyclerVie ...

  10. Windows系统下搭建Git本地代码库

    近由于工作需要,要把工作代码做一下版本管理.工作代码也不方便放到github上,也不想付费建私密库,公司也没几个人,所以就想着搭建一个本地Git版本库,来做版本管理.搭建过程如下. 系统环境:Dell ...