PHP实现微信企业付款
一、封装微信企业付款类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实现微信企业付款的更多相关文章
- 关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案
前言: 最近做了一个通过调用微信企业付款到用户零钱的功能,真的挺奇怪的,在我本地调试的时候都没有问题,但是当我发布到服务上的时候却一直无法读取到我的证书信息.读取的代码如下,使用的是微信官方文档提供 ...
- thinkphp.2 thinkphp5微信支付 微信公众号支付 thinkphp 微信扫码支付 thinkphp 微信企业付款5
前面已经跑通了微信支付的流程,接下来吧微信支付和微信企业付款接入到thinkphp中,版本是3.2 把微信支付类.企业付款类整合到一起放到第三方类库,这里我把微信支付帮助类和企业付款类放到同一个文件了 ...
- JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载
最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...
- PHP实现微信企业付款到个人零钱步骤
微信支付企业付款到零钱功能应用广泛,比如微信红包奖励,业务结算等.通过企业向个人付款,付款资金将直接进入用户微信零钱. 一 开通条件 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的 ...
- 微信企业付款获取RSA
package com.hentica.app.test.wx; import com.plant.app.modules.pay.wxpay.config.WxpayConfig; import o ...
- 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...
- 微信分账功能与微信支付企业付款相关内容详解(payjs版)
PAYJS开通微信分账功能以来,有很多同学咨询相关情况.很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能.这里就介绍下微信分账的具体相关内容,可以完美解决问题. 一.什么是微信分账? ...
- PHP微信商户支付企业付款到零钱功能
一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
随机推荐
- 第23章 Windows身份验证 - Identity Server 4 中文文档(v1.0.0)
在支持的平台上,您可以使用IdentityServer使用Windows身份验证对用户进行身份验证(例如,针对Active Directory).当前使用以下命令托管IdentityServer时,W ...
- JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() {}有什么区别?
对于新手来说(本人也是新手-_-!),好像var foo = function () {} 和 function foo(){}并没有什么区别,意识里可能就认为就是两种不同的写法而已.但是,通过网上查 ...
- Mysql基本操作指令集锦
一.MySQL服务的启动.停止与卸载 在 Windows 命令提示符下运行: 启动: net start MySQL 停止: net stop MySQL 卸载: sc delete MySQL 二. ...
- Azure WebJob-Custom Schedule for Azure Web Job Timer Triggers
如果想实现Azure Schedule WebJob,有两种方法: 1. 配置CRON Expression,网上有在线CRON配置工具,根据业务需要配置即可 注意:Azure的CRON Expres ...
- 开启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 ...
- iOS----------YYModel
weaterInfoModel *weather = [weaterInfoModel yy_modelWithDictionary:returnData[@"weatherinfo&quo ...
- ASP.NET MVC从空项目开始定制项目
在上一篇net core的文章中已经讲过如何从零开始搭建WebSocket. 今天聊聊ASP.NET的文件结构,如何用自己的目录结构组织项目里的文件. 如果用Visual Studio(VS)向导或d ...
- DVWA 黑客攻防演练(五)文件上传漏洞 File Upload
说起文件上传漏洞 ,可谓是印象深刻.有次公司的网站突然访问不到了,同事去服务器看了一下.所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映 ...
- 转摘Linux命令工作中常用总结
Linux命令工作中常用总结 1. 搜索 在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜索定位: 在vi和vim界面中输入:"/" ...
- Linux简单配置SendMail发送邮件
本文简单整理了一下如何在Linux服务器上安装.配置SendMail发送邮件的步骤,此文不是配置邮件服务器,具体测试环境为CentOS Linux release 7.2.1511 (Core) ,如 ...