微信支付之企业付款_付款金额超出限制。低于最小金额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

智能推荐

Cadence CIS 器件管理平台解决方案_eda设计元器件管理系统-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏31次。CIS 器件管理平台解决方案一、 概要CIS业界应用最广泛的原理图设计工具,在Cadence公司产Allegro Design Entry CIS /Allegro PCB Design CIS L /XL / GXL都包含有CIS器件管理平台。此平台可以科学管理与积累企业的智力资源,并能提高研发团队的效率以及规范性、整合企业 ERP/PDM系统优化研发流程。下图为CIS设计流程..._eda设计元器件管理系统

探索《实用Python与OpenCV》项目:强大的图像处理和计算机视觉教程-程序员宅基地

文章浏览阅读344次,点赞4次,收藏4次。探索《实用Python与OpenCV》项目:强大的图像处理和计算机视觉教程项目地址:https://gitcode.com/willard-yuan/practical-python-and-opencv项目简介《实用Python与OpenCV》 是一个开源项目,旨在通过一系列精心设计的实例,帮助开发者和爱好者学习如何使用Python和OpenCV进行图像处理和计算机视觉应用。该项目由Wil...

毕业设计 基于机器视觉的智能快递分拣系统-程序员宅基地

文章浏览阅读915次,点赞6次,收藏6次。利用大规模视觉导航机器人进行快递分拣,涉及调度系统的设计、视觉导航机器人设计、大规模机器人模拟软件设计、路径规划算法研究,涉及技术栈java、C++、c、spring、swing、netty、openCV、ardunio、调度、路径规划、嵌入式、PID控制。我国物流行业的分拣环节基本还处于人工分拣阶段,存在分拣效率低下、人工成本高、差错率高等问题。

窗口无故失去焦点解决方案_pb 窗口 失去焦点事件-程序员宅基地

文章浏览阅读5k次,点赞3次,收藏4次。 首先确定是哪个应用进程抢占了焦点。这里用如下的软件 这个软件能自动识别是哪个进程抢占了焦点, 1.若是句柄值在两个之间变化的直接定位到相应句柄值,使用如下软件 输入对应句柄值,强制关闭即可。 2.若句柄值实时变化的话 ,记住标题名,如我是碰到这种 然后输入: ..._pb 窗口 失去焦点事件

获取数据库连接的三种方式(已经注册驱动)_condition 获取数据库驱动-程序员宅基地

文章浏览阅读8.9w次。1:Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/exam", "root", "321");2:Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/exam?user=_condition 获取数据库驱动

运维工程师如何成为网络安全网盾工程师-程序员宅基地

文章浏览阅读838次,点赞15次,收藏23次。基础运维工程师的出路就是逐渐偏向网络安全运维工程师,也就是网盾工程师。伴随着互联网的产生和发展,网络安全问题层出不穷,各式各样安全漏洞的涌现,运维与安全这两个专业日渐交融,人们对运维安全的重视程度越来越高,出现了一个新的交叉领域叫“运维安全”。黑客、白帽子忙于挖掘运维安全漏洞,企业忙于构建运维安全体系,一时间无数漏洞纷至沓来,座座堡垒拔地而起。现实中的业务、运维、安全的关系是互相关联、彼此依赖的。从这张图中,衍生出三个不同与安全相关的子专业:“运维+安全”,“安全+运维”,“业务+运维+安全”。

随便推点

SFT会改善LLM性能,RLHF可能会损害性能_rlhf和sft有什么区别-程序员宅基地

文章浏览阅读683次,点赞8次,收藏7次。领域自适应:预训练的语言模型通常在大规模通用语料库上进行训练,而SFT可以通过在特定领域的数据上微调模型,使其更好地适应该领域的特定模式、术语和上下文。人类反馈的限制:RLHF依赖于人类提供的反馈信号来指导模型的学习。SFT(Structured Fine-Tuning)是一种模型优化技术,它通过在预训练的语言模型上进行有针对性的微调,以适应特定任务或领域。数据增强:SFT通常会使用特定任务或领域的数据来微调模型,这种数据增强可以丰富模型的训练数据,提供更多的样本和多样性,有助于改善模型的泛化能力和性能。_rlhf和sft有什么区别

Matlab图像处理基础(2):区域处理,边沿检测_matlabedge函数-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏25次。基于Matlab的图像处理基础介绍。Matlab提供了丰富的图像处理相关的工具箱,基于Matlab代码实验可以使得图像处理算法的理解变得更加简单直观。 以下所介绍的一些matlab工具函数都限于篇幅只涉及其基本的用法,更丰富的参数设定等可以查阅matlab说明。 本篇是本系列第二篇,介绍区域处理(Regional Processing),包括卷积、相关、高通滤波(边沿检测)、低通滤波(平滑)等。 上一篇参见:Matlab图像处理基础(part 1) 区_matlabedge函数

Python 下的Mock..._python mock 开发-程序员宅基地

文章浏览阅读4.4k次。Mock Object 在 单元测试 中起到了重要的作用,Python 下的 Mock 库有哪些呢?搜索了一下,只找到了两个,一个是pMock, 一个是 Python-Mock 感觉 pMock 用起来好一些,至少文档比较详细:)_python mock 开发

ant design pro 代码学习(七) ----- 组件封装(登录模块)_login[item] = loginitem[item];-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏20次。  以登录模块为例,对ant design pro的组件封装都相关分析。登录模块包含基础组件的封装、组件按模块划分、同类组件通过配置文件生成、跨层级组件直接数据通信等,相对来说还是具有一定的代表性。1、登录模块流程图  首先,全局了解一下登录模块的总体流程。如下图所示。该流程图主要分两部分:1、页面布局;2、组件封装。黄色实线表示页面中组件的引用。下边会对基础组件分析,以及多层级组件直接的..._login[item] = loginitem[item];

MQTT产品对比_.net mqtt 开源 对比-程序员宅基地

文章浏览阅读2.7k次。常见MQTT产品对比https://github.com/mqtt/mqtt.github.io/wiki/servershttps://github.com/mqtt/mqtt.github.io/wiki/server-supportServer QoS 0 QoS 1 QoS 2 auth bridge $SYS SSL dy..._.net mqtt 开源 对比

js书写移动端常用事件_js 移动端 手写事件-程序员宅基地

文章浏览阅读554次。 移动端的事件是新增的,叫“touch”事件 触摸事件。click点击事件依然支持,会有300ms的延迟touchstart, tap, click的加载快慢顺序touchstart &gt; tap &gt; click 开始触摸 :touchstart触摸移动:touchmove触摸结束:touchend 事件对象获取手指按下的位置在touchs..._js 移动端 手写事件

推荐文章

热门文章

相关标签