php 微信支付企业付款

1.所需参数

字段名 变量名 必填 示例值 类型 描述
公众账号appid mch_appid wx8888888888888888 String 公众号的appId
商户号 mchid 1900000109 String(32) 微信支付平台商户号
就是平台账号
随机字符串 nonce_str 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 随机字符串,随便随机个什么<32位
商户订单号 partner_trade_no 10000098201411111234567890 String 订单号,保持唯一性,自定义一个随机订单号
用户
openid
openid oxTWIuGaIt6gTKsQRLau2M0yL16E String 商户appid下,某用户的openid
校验用户姓名选项 check_name NO_CHECK
不检验 (小额推荐)
FORCE_CHEC
强制检验
OPTION_CHECK
自动检验
String NO_CHECK:不校验真实姓名 
FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) 
OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
收款用户姓名 re_user_name 可选 马花花
(如果上一个参数为强制检验此为必填项)
String 收款用户真实姓名。 
如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
金额 amount 100
单位为分
100就是100分.
int 企业付款金额,单位为分
企业付款描述信息 desc 奖金啊,提现成功啊
退款成功啊什么的
String 企业付款操作说明信息。必填。
Ip地址 spbill_create_ip 192.168.0.1 String(32) 调用接口的机器Ip地址服务器ip

支付密钥

key

F5YguNW77Ao4N5yu5wZ8Lb00NKO987ks


String(32)
设置在商户平台上的支付密钥

签名

sign


C380BEC2BFD727A4B6845133519F3AD6

String(32)

上面的内容的一个综合的加密结果

2.还需要支付时使用的证书

3.签名的规则

意思就是将上述的除了支付秘钥和签名的9-10项(因为收款用户姓名是根据验证选项而决定是否需要的)

按照ASCII的从小到大排序之后的字符串

例如:$str = "amount=100&check_name=NO_CHECK&desc=奖金啊,提现成功啊 退款成功啊什么的&mch_appid=wx8888888888888888&mchid=1900000109&nonce_str=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&partner_trade_no=10000098201411111234567890&spbill_create_ip=192.168.0.1";

  1. 签名是不是一直变动的呢?是的 每一个签名都是不一样的,别想着存起来一直用!怎么算呢?官方有一个文档,对于会的人来说就是废话,对于不会的来说就是天书。总的来说分为3部,官方有一个签名生成工具https://pay.weixin.qq.com/wiki/tools/signverify/
    1. 将你本次请求的所有参数(当然除了签名),按照一定的顺序排序成一个字符串,顺序一会再说,先说格式,比如本次的这次请求有9个参数:

      $str = "amount=100&check_name=NO_CHECK&desc=奖金啊,提现成功啊 退款成功啊什么的&mch_appid=wx8888888888888888&mchid=1900000109&nonce_str=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&partner_trade_no=10000098201411111234567890&spbill_create_ip=192.168.0.1";

      仔细观察不难发现,字符串排列是有顺序的 为键值首字母的排列顺序。而官方为了听起来霸气,讲的是根据 参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式排序吓的我一哆嗦啊! 不就字母顺序表么!不过仔细一看发现不对了,比如 mchid和 mch_appid这尼玛前三个字母一样啊,一位一位排序下来出现一个 i 和 _怎么办呢? 这时候就用到ASCII码表了,不过看官也不用去查了 上面的可以直接粘去用了 而ASCII码表的顺序呢就是按照0123456789:;< = > ? @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [ \ ] ^ _ ` abcdefghijklmnopqrstuvwxyz { | }~的顺序排列 那么我门就知道mch_appid应该在 mchid 前面了。

    2. 排序完这9个参数 之后再用&加上特殊参数 微信支付平台上设置的支付密钥就是

      $str = "amount=100&check_name=NO_CHECK&desc=奖金啊,提现成功啊 退款成功啊什么的&mch_appid=wx8888888888888888&mchid=1900000109&nonce_str=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&partner_trade_no=10000098201411111234567890&spbill_create_ip=192.168.0.1&key=F5YguNW77Ao4N5yu5wZ8Lb00NKO987ks"

    3. 之后就简单了先md5加密下然后转为大写 签名就OK了

      $sign = strtoupper(md5($str));

然后我们就要将这些参数填充到xml格式的字符串中去了

4.开始撸码吧

        /**
     * 格式化参数格式化成url参数
     */
    public function ToUrl($arr)
    {
        $buff = "";
        foreach ($arr as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }
        //将乱序的数组
        public function ToSign($arr,$key)
    {
        //签名步骤一:按字典序排序参数
        ksort($arr);
        $string = ToUrl($arr);
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".$key;
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
//        $result1 = strtoupper($string);
        return $string;
    }
/**
     * 输出xml字符
     * @throws WxPayException
    **/
    public static function ToXml($arr)
    {
        if(!is_array($arr) || count($arr) <= 0)
        {
            echo ‘数据异常‘;
    }
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }
/**
     * zll 生成唯一订单号
     */
    public function order_sn(){
        $str = "qyfk".uniqid();
        return $str;
    }
/**
     * zll 将信息提交到微信服务器,发起企业付款
     */
    public function qyzf_post($url,$xml,$config,$second=30){
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//        curl_setopt($ch,CURLOPT_SSLCERT,"/home/lizi/addons/grow/template/mobile/cash/apiclient_cert.pem");
//        curl_setopt($ch,CURLOPT_SSLKEY,"/home/lizi/addons/grow/template/mobile/cash/apiclient_key.pem");
        $str = ‘D:/www/‘;//证书必须使用绝对路径,否则报错,错误貌似是52什么的
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,‘PEM‘);
        curl_setopt($ch,CURLOPT_SSLCERT,$str.trim($config[‘apiclient_cert‘],‘.‘));
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,‘PEM‘);
        curl_setopt($ch,CURLOPT_SSLKEY,$str.trim($config[‘apiclient_key‘],‘.‘));
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }else{
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n";
            curl_close($ch);
            return false;
        }
    }
/**
     * zll 企业付款
     */
    public function qiyezhifu($data){
        //解释amount为付款金额,单位分,貌似最低1元,desc为付款的描述(必填),ip就是服务器ip必填
        //$data = array(‘wxappid‘=>14,‘openid‘=>‘oRyzq0LrtuqKqQdH-FubBqcMuTi8-‘,‘amount‘=>100,‘desc‘=>‘提现奖励‘,‘ip‘=>‘123.207.19.254‘);

        //获取数据库的支付配置信息
        $config = get_pay_conf($data[‘wxappid‘]);
        if($config){
            //对必备参数进行有效性判断
            if(empty($config[‘appid‘]) || empty($config[‘shh‘]) || empty($config[‘partnerkey‘]) || empty($data[‘amount‘]) || empty($config[‘apiclient_cert‘]) || empty($config[‘apiclient_key‘])){
                throw new Exception("支付配置中的appid或商户号或支付秘钥不能为空,或支付金额不能为空");
            }else{
                $da[‘mch_appid‘] = $config[‘appid‘];                //appid
                $da[‘mchid‘] = $config[‘shh‘];                        //商户号
                $da[‘nonce_str‘] = $this->getStr(32);                //随机字符串
                $da[‘partner_trade_no‘] = $this->order_sn();        //订单号,保持唯一性即可
                $da[‘openid‘] = $data[‘openid‘];                    //粉丝的openid
                $da[‘check_name‘] = "NO_CHECK";                        //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
                //$da[‘re_user_name‘] = "";                            //收款用户真实姓名。 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
                $da[‘amount‘] = $data[‘amount‘];                            //付款金额,单位分
                $da[‘desc‘] = $data[‘desc‘] ? $data[‘desc‘]:"提现奖励";                            //企业付款描述信息
                $da[‘spbill_create_ip‘] = $data[‘ip‘] ? $data[‘ip‘] : "123.207.19.254";            //服务器ip
                $da[‘sign‘] = $this->ToSign($da, $config[‘partnerkey‘]);//生成签名
                //$da[‘key‘] = $config[‘partnerkey‘];                    //支付秘钥

                //将数组转为xml
                $xml = $this->ToXml($da);
                $url = ‘https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers‘;
                $this->qyzf_post($url,$xml,$config);
            }
        }else{
            return false;
        }
    }

上面的代码我是在thinkphp3.2框架里面写的,所以方法之间的调用用的是$this->XXX();

其他的框架或原生的php可以进行修改方法调用方式即可

原文地址:https://www.cnblogs.com/zonglonglong/p/8523343.html

时间: 2024-11-08 07:21:31

php 微信支付企业付款的相关文章

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

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

微信支付 企业转账 小程序发红包 提现 发红包 企业支付等遇到的问题

最近公司在开发一个项目,小程序抢红包,抢到的红包用户要提现.商家需要通过微信的企业转账功能打款到微信的钱包里. 开发的时候发现有几个坑,在这里和大家分享下.首先就是微信支付的开通条件. 第一个,就是个体工商户注册的微信支付,是没有企业转账到微信钱包的功能的.必需是企业资质申请的才有. 然后发现个体工商户里有一个转账到个人银行卡的,这个是要收千分之一的手续费,也是微信最近推出来的功能,但是,既然在微信官方开发文档里找不到相关的api接口文档.额,还在内测期间么.... 请注意开通的前两个条件,如果

微信:企业付款给用户

微信企业付款给个人零钱 使用盛派开发的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代码实现

写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现, 其实最后实现还是借助 微信公众平台开发文档 和 SDK. 企业付款的应用场景: 公众号向已关注用户付款,比如处理退款.财务结算等 先说一下实现思路: 在SDK中自带类库的基础上扩展WxMchPay组件, 实现企业付款功能的扩展. 话不多说,上代码, 下面是继承SDK,实现企业付款的组件: $parameters参数参考: 企业付款API的文档 <?php // 引入SDK import('Common.Util

微信支付 获取RSA加密公钥API JAVA版

近做微信支付  企业付款到银行卡,其中收款方银行卡号.收款方用户名需要获取RSA加密公钥API进行加密:本文以windows为例: 微信开发文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7&index=4 openssl下载地址:http://slproweb.com/products/Win32OpenSSL.html 获取接口: 首先要通过接口获取PKCS#1格式的公钥,再转为PKCS#8格式

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

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

微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结

前言 很久以来,一直想写一篇微信支付有关的总结文档:一方面是总结自己的一些心得,另一方面也可以帮助别人,但是因种种原因未能完全理解透彻微信支付的几大支付方式,今天有幸做一些总结上的文章,也趁此机会,将一年多以来的相关经验分享一下. 概述 1. 扫码支付 商户在pc端展示一个支付二维码,用户使用微信扫一扫功能,扫码后实现付款的支付方式. 2. 公众号支付 商户在微信APP内(微信浏览器)打开H5网页,通过微信支付实现付款的支付方式. 3. H5支付 商户在微信浏览器以外的手机浏览器打开H5网页,通

微信支付开发中一些心得

1.微信支付的付款单位是分,最后的金额要将元转成分,这里需要注意的是java如果直接通过double或者float计算的出来的数字有可能是带有小数点的. 例如:double d = 3.85100:结果是385.0 微信支付金额不允许带有小数点,这样的参数提交到微信支付会提示:参数传递错误*. 2.带有微信支付的android app运行在手机之后,有可能获取access token,preparedId之后没有任何相应.这里有可能是因为app没有signature的原因.在微信开放平台中有一个

C#开发微信支付之企业向用户付款

1.企业付款的介绍 所谓企业付款指的是,在功能开放后诸如保险行业的客户理赔.退保.商品退款.发放征集活动奖金.抽奖互动等操作都可以通过企业付款完成.而此前,微信支付只能提供客户向企业单向付款. 商户如果需要给用户付款,可以直接将钱打入用户的"微信零钱"中,微信支付将做零钱入账消息通知,零钱收支明细会展示相应记录.针对无零钱账户的历史客户端版本,资金将进入用户的红包账户,微信支付无消息通知用户,企业可选择自行触达用户. 通过认证的企业号可以开通微信支付功能.通过认证的企业号可以管理平台的