微信支付之企业付款_付款金额超出限制。低于最小金额1.00元或累计超过20000.00元-程序员宅基地

技术标签: php  

企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。 比如目前的保险行业向客户退保、给付、理赔。

企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”进行操作。https://pay.weixin.qq.com/ 
注意: 与商户微信支付收款资金并非同一账户,需要单独充值。企业付款需要证书。

说到代码实现,又不得不吐槽一下官方文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)和SDK(下载:https://pay.weixin.qq.com/wiki/doc/api/download/cert.zip)了,基本跟没有差不多,全靠程序猿自己摸索然后进行代码实现。

主要步骤:
(1)构造post请求的数据

这个,需要哪些参数可以参照文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.PHP?chapter=14_2,我根据文档构造方法如下:

  1. /** 
  2.  * 企业支付 
  3.  * @param string $openid    用户openID 
  4.  * @param string $trade_no  单号 
  5.  * @param string $money     金额 
  6.  * @param string $desc      描述 
  7.  * @return string   XML 结构的字符串 
  8.  */  
  9. public function pay($openid,$trade_no,$money,$desc){  
  10.     $data = array(  
  11.         'mch_appid' => WxPayConfig::APPID,  
  12.         'mchid'     => WxPayConfig::MCHID,  
  13.         'nonce_str' => self::getNonceStr(),  
  14.         //'device_info' => '1000',  
  15.         'partner_trade_no' => $trade_no//商户订单号,需要唯一  
  16.         'openid'    => $openid,  
  17.         'check_name'=> 'NO_CHECK'//OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:  
  18.         //'re_user_name' => 'jorsh', //收款人用户姓名  
  19.         'amount'    => $money * 100, //付款金额单位为分  
  20.         'desc'      => $desc,  
  21.         'spbill_create_ip' => self::getip()  
  22.     );  
  23.       
  24.     //生成签名  
  25.     $data['sign'] = self::makeSign($data);  
  26.     //构造XML数据  
  27.     $xmldata = self::array2xml($data);  
  28.     $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';  
  29.     //发送post请求  
  30.     $res = self::curl_post_ssl($url$xmldata);  
  31.     if(!$res){  
  32.         return array('status'=>1, 'msg'=>"Can't connect the server" );  
  33.     }  
  34.     // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了  
  35.     file_put_contents(APP_ROOT.'/Api/wxpay/logs/log2.txt',$res,FILE_APPEND);  
  36.       
  37.     //付款结果分析  
  38.     $content = self::xml2array($res);  
  39.     if(strval($content['return_code']) == 'FAIL'){  
  40.         return array('status'=>1, 'msg'=>strval($content['return_msg']));  
  41.     }  
  42.     if(strval($content['result_code']) == 'FAIL'){  
  43.         return array('status'=>1, 'msg'=>strval($content['err_code']),':'.strval($content['err_code_des']));  
  44.     }  
  45.     $resdata = array(  
  46.         'return_code'      => strval($content['return_code']),  
  47.         'result_code'      => strval($content['result_code']),  
  48.         'nonce_str'        => strval($content['nonce_str']),  
  49.         'partner_trade_no' => strval($content['partner_trade_no']),  
  50.         'payment_no'       => strval($content['payment_no']),  
  51.         'payment_time'     => strval($content['payment_time']),  
  52.     );  
  53.     return $resdata;  
  54. }  

(2)发送数据请求请求的curl函数,可以去官方下载:https://pay.weixin.qq.com/wiki/doc/api/download/cert.zip。下载完毕将证书改成自己的证书路径就可以了。
  1. /** 
  2.  * 企业付款发起请求 
  3.  * 此函数来自:https://pay.weixin.qq.com/wiki/doc/api/download/cert.zip 
  4.  */  
  5. public function curl_post_ssl($url$xmldata$second=30,$aHeader=array()){  
  6.     $ch = curl_init();  
  7.     //超时时间  
  8.     curl_setopt($ch,CURLOPT_TIMEOUT,$second);  
  9.     curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);  
  10.     //这里设置代理,如果有的话  
  11.     //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');  
  12.     //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);  
  13.     curl_setopt($ch,CURLOPT_URL,$url);  
  14.     curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);  
  15.     curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);  
  16.       
  17.     //以下两种方式需选择一种  
  18.       
  19.     //第一种方法,cert 与 key 分别属于两个.pem文件  
  20.     //默认格式为PEM,可以注释  
  21.     curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');  
  22.     curl_setopt($ch,CURLOPT_SSLCERT,WxPayConfig::SSLCERT_PATH);  
  23.     //默认格式为PEM,可以注释  
  24.     curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');  
  25.     curl_setopt($ch,CURLOPT_SSLKEY,WxPayConfig::SSLKEY_PATH);  
  26.       
  27.     //第二种方式,两个文件合成一个.pem文件  
  28.     //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');  
  29.    
  30.     ifcount($aHeader) >= 1 ){  
  31.         curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);  
  32.     }  
  33.    
  34.     curl_setopt($ch,CURLOPT_POST, 1);  
  35.     curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);  
  36.     $data = curl_exec($ch);  
  37.     if($data){  
  38.         curl_close($ch);  
  39.         return $data;  
  40.     }  
  41.     else {   
  42.         $error = curl_errno($ch);  
  43.         echo "call faild, errorCode:$error\n";   
  44.         curl_close($ch);  
  45.         return false;  
  46.     }  
  47. }  

我将完整的代码封装成了一个类,可以直接引入项目更改一下配置参数就可以使用的,源码下载: http://download.csdn.net/detail/sinat_35861727/9858508

调用就超级简单了,引入项目之后就直接调用:

  1. //测试支付  
  2. public function test(){  
  3.       
  4.     $openid = 'ovprvtzBZaWXnZUadwgexOLNc93M';  
  5.     $trade_no = date('YmdHis').mt_rand(1000,9999);  
  6.     $res = self::pay($openid,$trade_no,1,'提现');  
  7.     return $res;  
  8. }  
  1. //引入企业付款类  
  2. require_once APP_ROOT.'/Api/merchpay.class.php';  
  3. $merch = new \MerchPay();  
  4. $res =  $merch->test();    
  5. print_r($res);  
支付失败时返回的数据:
  1. <xml>  
  2. <return_code><![CDATA[SUCCESS]]></return_code>  
  3. <return_msg><![CDATA[支付失败]]></return_msg>  
  4. <mch_appid><![CDATA[wx09e38d3dcca919a4]]></mch_appid>  
  5. <mchid><![CDATA[1314969701]]></mchid>  
  6. <result_code><![CDATA[FAIL]]></result_code>  
  7. <err_code><![CDATA[AMOUNT_LIMIT]]></err_code>  
  8. <err_code_des><![CDATA[付款金额超出限制。低于最小金额1.00元或累计超过20000.00元。]]></err_code_des>  
  9. </xml>  
支付成功返回:
  1. <xml>  
  2. <return_code><![CDATA[SUCCESS]]></return_code>  
  3. <return_msg><![CDATA[]]></return_msg>  
  4. <nonce_str><![CDATA[kxm3zzlobtmb90rfodfejhug6qfosstl]]></nonce_str>  
  5. <result_code><![CDATA[SUCCESS]]></result_code>  
  6. <partner_trade_no><![CDATA[201706011750279780]]></partner_trade_no>  
  7. <payment_no><![CDATA[1000018301201706017928874552]]></payment_no>  
  8. <payment_time><![CDATA[2017-06-01 17:50:28]]></payment_time>  
  9. </xml>  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36663951/article/details/76167773

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签