微信开发 -- 企业付款 PHP代码实现

写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现,

其实最后实现还是借助 微信公众平台开发文档 和 SDK

企业付款的应用场景: 公众号向已关注用户付款,比如处理退款、财务结算等

先说一下实现思路:

在SDK中自带类库的基础上扩展WxMchPay组件, 实现企业付款功能的扩展。

话不多说,上代码, 下面是继承SDK,实现企业付款的组件:

$parameters参数参考: 企业付款API的文档

<?php
// 引入SDK
import(‘Common.Util.WxPay‘);

/**
 * 微信企业付款操作类
 * Author  :  Max.wen
 * DateTime: <15/9/16 11:00>
 */
class WxMchPay extends Wxpay_client_pub
{
    /**
     * 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 function __construct()
    {
        $this->url = ‘https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers‘;
        $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
    }

    /**
     * 生成请求xml数据
     * @return string
     */
    public function createXml()
    {
        $this->parameters[‘mch_appid‘] = WxPayConf_pub::APPID;
        $this->parameters[‘mchid‘]     = WxPayConf_pub::MCHID;
        $this->parameters[‘nonce_str‘] = $this->createNoncestr();
        $this->parameters[‘sign‘]      = $this->getSign($this->parameters);
        return $this->arrayToXml($this->parameters);
    }

    /**
     *     作用:使用证书,以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, WxPayConf_pub::SSLROOTCA_PATH);
        //使用证书:cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,‘PEM‘);
        curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,‘PEM‘);
        curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::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;
        }
    }

}

Controller层功能实现:

<?php
/**
 * Author  :  Max.wen
 * DateTime: <15/9/20 16:47>
 */

namespace Home\Controller;

class TestController extends CommonController
{

    /**
     * 企业付款测试
     */
    public function rebate()
    {
        import(‘Common.Util.WxMchPay‘);
        $mchPay = new \WxMchPay();
        // 用户openid
        $mchPay->setParameter(‘openid‘, ‘oy2lbszXkgvlEKThrzqEziKEBzqU‘);
        // 商户订单号
        $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()) );
        }
    }
}

完成上述两部分代码,基本就可以成功调用企业付款API了。

返回结果的数据结构示例:

{
	"return_code": "SUCCESS",
	"return_msg": { },
	"mch_appid": "wx519cae424099ed6b",
	"mchid": "1228636402",
	"device_info": { },
	"nonce_str": "qjupk84q4iqxkb578hb5h2qiatgcwxwg",
	"result_code": "SUCCESS",
	"partner_trade_no": "test-1442801966",
	"payment_no": "1000018301201509210739170397",
	"payment_time": "2015-09-21 10:19:26"
}

  

可能遇到的问题:

1、CA证书错误

  在WxMchPay中大家可以看到,我重写了SDK中 Wxpay_client_pub 的 postXmlSSLCurl()方法

  因为默认在SDK中的这个方法在CURL POST请求的时候没有附带CA证书。

  相比之下就多了

  curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);  这么一行代码。  

  作用就是请求时附带CA证书。

2、对同一用户转账操作过于频繁,请稍候重试.

  这个错误属于微信服务端的限制,具体限制频率也没有找到那里有说明,不过经过实际测试大概在1分钟左右。

  所以在开发的时候还需要多注意。

有任何疑问欢迎共同探讨。

P.S. 搬家至博客园的第一篇随笔, 送给组织的见面礼。希望再次广交猿友。
时间: 2024-10-05 17:59:02

微信开发 -- 企业付款 PHP代码实现的相关文章

asp微信支付企业付款功能代码下载

最近应一个客户要求写了一段代码,要求从公众号的支付平台给用户发钱,我大体看了一下,这叫企业付款功能,由于客户的代码是asp写的,所以只能用asp来写接口了,这个功能还比较实用,可以片外支付从0.30元以上的钱付给用户,不说了,下面让代码: 微信公众号支付平台asp企业付款功能代码: <% '作者微信:18611436777,转载请保留 set wxpay = New WxPayApi Dim Action,total_fee Action = Trim(Request.QueryString(&qu

微信:企业付款给用户

微信企业付款给个人零钱 使用盛派开发的sdk :nuget地址 senparc.weixin.mp.dll 盛派sdk地址:https://weixin.senparc.com/ 盛派SDK github 地址:https://github.com/JeffreySu/WeiXinMPSDK 企业付款API 使用接口: TenPayV3.Transfers(TenPayV3TransfersRequestData dataInfo, string cert, string certPasswor

php 微信支付企业付款

1.所需参数 字段名 变量名 必填 示例值 类型 描述 公众账号appid mch_appid 是 wx8888888888888888 String 公众号的appId 商户号 mchid 是 1900000109 String(32) 微信支付平台商户号就是平台账号 随机字符串 nonce_str 是 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 随机字符串,随便随机个什么<32位 商户订单号 partner_trade_no 是 100000982

11. PHP接入微信企业付款功能

payment 项目2.0版本 这个功能与支付宝的批量付款到支付宝帐号功能类似.但是当前支付宝这个接口已经停止审核了. 当前很多提问平台就用到了这两个平台.比如[来问医生],你提的问题如果被人看了.医生得0.5元,你得0.5元.然后累积够1元后,[来问医生]就会通过微信的企业付款功能给你的微信余额增加1元. 代码调用 use Payment\TransferContext; use Payment\Common\PayException; use Payment\Config; // 生成转款单

微信开发学习日记(四):研究和部署开源产品

4月份开始,在深入研究微信开发了.   在了解了更多信息之后,发现微信这玩意,非常简单,也非常复杂. 简单,官方就提供了几十个接口,实现起来很简单嘛.网上有几套Java版的实现,PHP的就更多了. API的实现,Java方面,我是根据柳峰微信开发那本书的代码,经过大量改造弄的,目前实现了一半的接口,剩下的一半,晚点需要的时候再实现.Java的代码,看起来比较清晰. PHP方面,网上也有很多.初步了解了LaneWeChat这个SDK.更多PHP 的SDK还在研究中. 总之,尽可能用别人的,只要别人

微信公众平台开发(111) 现金红包、裂变红包、企业付款

keyword:微信公众平台 微信红包 现金红包 裂变红包 企业付款 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/wxpay-mkt-transfer.html  在这篇微信公众平台开发教程中,我们将介绍怎样在实现现金红包.裂变红包.企业付款以及红包交易查询(含现金红包和裂变红包)和企业付款查询的功能. 本文分为下面二个部分: 微信支付接口SDK定义 现金红包.裂变红包.企业付款的调用方法 一.微信红包SDK 现金红包.裂变红包.企业付款本质均为商户

微信企业付款到个人钱包引发的坑之反思~

企业付款到个人钱包也就是用户在微信公众平台提现可以直接打入提现者微信的钱包!但要满足: 1)企业开通微信支付90天 2)连续30天有交易才能开通此功能 今天有幸能开发此功能,我只能说我又涨知识了!!!在我编程的这条道路上我又多见到了一些坑!下面就给大家讲一下今天遇到的两个坑! 1)CA证书引入问题,开发过程中遇到了CA证书验证失败的问题,百度之后网上有的说要用绝对路径,有的人说要用相对路径! curl_setopt($curl,CURLOPT_SSLCERT,getcwd()."/cert/ap

微信企业付款到个人钱包引发的坑之反思~!

企业付款到个人钱包也就是用户在微信公众平台提现可以直接打入提现者微信的钱包!但要满足: 1)企业开通微信支付90天 2)连续30天有交易才能开通此功能 今天有幸能开发此功能,我只能说我又涨知识了!!!在我编程的这条道路上我又多见到了一些坑!下面就给大家讲一下今天遇到的两个坑! 1)CA证书引入问题,开发过程中遇到了CA证书验证失败的问题,百度之后网上有的说要用绝对路径,有的人说要用相对路径! 小梦使用的是Thinkphp3.2框架开发的这个功能,最终我结果告诉我用绝对路径,还要用到PHP的一个函

微信企业付款到银行卡

第一次做微信企业付款到银行卡,特地记录下来,因为这个功能自己用了2-3天,这中间的坑主要是再rsa加密那块.自己记录下来,供朋友参考.自己用的php开发 第一,首先你需要开通企业的微信认证公众号平台,然后开通支付功能.这些我就不说了.自己开通. 第二,看文档, 第三步,发送请求接口,发送后,腾讯会给你响应.特别要说明一点的是,腾讯这个功能真不便宜,我测试时一元钱,手续费扣了我一元.最少金额是一元. 在发送接口时有个公钥我们首先要获得,同时里面有个签名算法,公钥主要用于到时银行账号和收款人姓名加密