一、封装微信企业付款类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. 第23章 Windows身份验证 - Identity Server 4 中文文档(v1.0.0)

    在支持的平台上,您可以使用IdentityServer使用Windows身份验证对用户进行身份验证(例如,针对Active Directory).当前使用以下命令托管IdentityServer时,W ...

  2. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() {}有什么区别?

    对于新手来说(本人也是新手-_-!),好像var foo = function () {} 和 function foo(){}并没有什么区别,意识里可能就认为就是两种不同的写法而已.但是,通过网上查 ...

  3. Mysql基本操作指令集锦

    一.MySQL服务的启动.停止与卸载 在 Windows 命令提示符下运行: 启动: net start MySQL 停止: net stop MySQL 卸载: sc delete MySQL 二. ...

  4. Azure WebJob-Custom Schedule for Azure Web Job Timer Triggers

    如果想实现Azure Schedule WebJob,有两种方法: 1. 配置CRON Expression,网上有在线CRON配置工具,根据业务需要配置即可 注意:Azure的CRON Expres ...

  5. 开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法

    开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法: 创建存储过程时 出错信息: ERROR 1418 (HY ...

  6. iOS----------YYModel

    weaterInfoModel *weather = [weaterInfoModel yy_modelWithDictionary:returnData[@"weatherinfo&quo ...

  7. ASP.NET MVC从空项目开始定制项目

    在上一篇net core的文章中已经讲过如何从零开始搭建WebSocket. 今天聊聊ASP.NET的文件结构,如何用自己的目录结构组织项目里的文件. 如果用Visual Studio(VS)向导或d ...

  8. DVWA 黑客攻防演练(五)文件上传漏洞 File Upload

    说起文件上传漏洞 ,可谓是印象深刻.有次公司的网站突然访问不到了,同事去服务器看了一下.所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映 ...

  9. 转摘Linux命令工作中常用总结

    Linux命令工作中常用总结   1. 搜索 在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜索定位: 在vi和vim界面中输入:"/" ...

  10. Linux简单配置SendMail发送邮件

    本文简单整理了一下如何在Linux服务器上安装.配置SendMail发送邮件的步骤,此文不是配置邮件服务器,具体测试环境为CentOS Linux release 7.2.1511 (Core) ,如 ...