微信支付 “商家转账到零钱”

yizhihongxing

这里有个坑

1:转账低于5毛会失败

2:转账金额需要自己取整一下,微信官方金额是 分 为单位,换算成 元 时可能会除不尽

  {   
    "code":"PARAM_ERROR",
    "detail":{
        "location":"body",
        "value":7.000000000000001   // 微信金额除不尽出现的问题
             },
        "message":" 无法将 JSON 输入源“\/body\/
                    total_amount”映射到目标字段“转账总金额”中,
                    此字段需要一个合法的 64 位有符号整数"
   }

1.服务层

   const SSLCERT_PATH = '证书路径';
    const SSLKEY_PATH  = '证书key路径';
    const MCHID        = '商户号';
    const APPID        = 'app_id';
    const KEY          = 'key值';

    /**
     * 付款到微信零钱
     * sOpenid:收款方openid
     * nMoney:转账金额
     */
    public function transfer_batches($sOpenid, $nMoney)
    {
        // 付款到零钱方法url
        $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';

        // 订单号
        $sOrderId = '测试付款' . time();
        // 转账备注 (微信用户会收到该备注)                                                    
        $tRemark  = '测试付款' . $sOrderId; 
        // 转账金额:微信是分为单位 *100 转换                                             
        $transfer_amount = $nMoney * 100;

        // 转账接收列表设置
        $transfer_detail_list = array(                
            [
                'out_detail_no'   => $sOrderId,                  // 明细单号
                'transfer_amount' => intval($transfer_amount),   // 转账总金额 
                'transfer_remark' => $tRemark,                   // 单条转账备注
                'openid'          => $sOpenid,                   // 收款方openid

                // 'user_name'       => '张三',
                // 转账金额 >= 2,000元,收款用户姓名必填                   
            ],
        );
        // 请求参数设置
        $params = [                                                // 请求参数设置
            'appid'                => self::APPID,                 // 文档顶部定义
            'out_batch_no'         => $sOrderId,                   // 商家批次单号
            'batch_name'           => 'x年x月转账',                 // 转账的名称 
            'batch_remark'         => 'x年x月转账',                 // 转账的备注
            'total_amount'         => intval($transfer_amount),    // 转账总金额
            'total_num'            => 1,                           // 转账总笔数
            'transfer_detail_list' => $transfer_detail_list,       // 转账接收列表
        ];
        // 获取token
        $token        = $this->getToken($params);
        // 发送请求                                    
        $res          = $this->https_request($url, json_encode($params), $token);
        // 反馈数组化  
        $resArr       = json_decode($res, true);                                   

        dump($resArr);
        // 存储转账成功信息或别的操作


        // 成功实例返回值
        {
          "out_batch_no": "plfk2020042013",                        // wx唯一识别号
          "batch_id": "1030000071100999991182020050700019480001",  // 商家批次单号
          "create_time": "2015-05-20T13:29:35.120+08:00"           // 创建时间 
        }
    }


    /**
     * 构造请求
     */
    function https_request($url, $data = null, $token)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, (string)$url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        // 添加请求头
        $headers =     [
            'Authorization:WECHATPAY2-SHA256-RSA2048 ' . $token,
            'Accept: application/json',
            'Content-Type: application/json; charset=utf-8',
            'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        ];
        if (!empty($headers)) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }

        $output = curl_exec($curl);
        curl_close($curl);

        return $output;
    }

    /**
     * 获取token
     */
    public function getToken($pars)
    {
        $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
        $http_method = 'POST';                                  // 请求方法(GET,POST,PUT)
        $timestamp   = time();                                  // 请求时间戳
        $url_parts   = parse_url($url);                         // 获取请求的绝对URL
        $nonce       = $timestamp . rand('10000', '99999');     // 请求随机串
        $body        = json_encode((object)$pars);              // 请求报文主体
        $stream_opts = [
            "ssl" => [
                "verify_peer"          => false,
                "verify_peer_name"     => false,
            ]
        ];

        // 证书路径信息:文档顶部定义
        $apiclient_cert_path = self::SSLCERT_PATH;
        $apiclient_key_path  = self::SSLKEY_PATH;

        $apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path, false, stream_context_create($stream_opts)));
        // 证书序列号
        $serial_no          = $apiclient_cert_arr['serialNumberHex'];
        // 密钥                                                                   
        $mch_private_key    = file_get_contents($apiclient_key_path, false, stream_context_create($stream_opts));
        // 商户id:文档顶部定义                       
        $merchant_id        = self::MCHID;                                                                                              
        $canonical_url      = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
        $message            = $http_method . "\n" .
            $canonical_url . "\n" .
            $timestamp . "\n" .
            $nonce . "\n" .
            $body . "\n";
        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
        // 签名
        $sign   = base64_encode($raw_sign);                                                                                                                
        $schema = 'WECHATPAY2-SHA256-RSA2048';
        $token  = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $merchant_id, $nonce, $timestamp, $serial_no, $sign); 
        // 微信返回token
        return $token;
    }

 

2.控制层

public function onTransferBatches($openid, $nMoney)
    {
        // 实例化服务层
        $serviceTransfer = new serviceTransfer();
        // 带参请求:sOpenid(收款方openid)   nMoney(转账金额)
        $result          = $serviceTransfer->transfer_batches($openid, $nMoney);
        return $result;
    }

 

原文链接:https://www.cnblogs.com/simpe/p/16949847.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信支付 “商家转账到零钱” - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • PHP+jQuery实现双击修改table表格功能示例

    下面是针对题目的完整攻略: 1. 实现思路 要实现双击修改table表格的功能,首先需要在table中将需要修改的文本设置为可编辑状态,并且通过jQuery监听双击事件。当用户双击需要修改的文本时,将其转换为可编辑状态,并将输入框插入到其中。用户在输入框中修改完内容后,通过Ajax将修改后的内容传递给后端进行更新,最后将更新后的内容渲染到页面上。 2. 实现…

    PHP 2023年5月26日
    00
  • php注册登录系统简化版

    下面我将给您详细讲解“PHP注册登录系统简化版”的完整攻略。 概述 “PHP注册登录系统简化版”是一个常见的Web应用程序,可以让用户通过注册和登录实现对某些资源的访问。在这个系统中,用户可以注册账号,登录系统,修改密码和注销账号。 技术要点 要实现“PHP注册登录系统简化版”,需要掌握以下技术要点: PHP基础知识:掌握PHP语法和流程控制语句; MySQ…

    PHP 2023年5月24日
    00
  • php下批量挂马和批量清马代码

    为了防范网络黑客的攻击,网站管理员需要了解网站被挂马后的处理方式。一般在PHP语言下,网站被挂马的原因是服务端的文件有漏洞,或者被管理员账户密码泄露,网站的代码造成的后果就是在用户请求页面时,程序会在页面HTML代码中嵌入一个恶意脚本或链接,使得用户在访问页面时会自动执行恶意脚本或链接,从而感染用户的电脑或手机。下面我们将为您介绍如何通过PHP代码来批量挂马…

    PHP 2023年5月23日
    00
  • PHP格式化显示时间date()函数案例讲解

    这里是“PHP格式化显示时间date()函数案例讲解”的完整攻略,包含以下内容: 1. 什么是PHP中的date()函数? 在 PHP 中,date() 函数用于格式化日期和时间。使用该函数可以获取当前时间或指定时间的某个格式。 2. date()函数语法和参数说明 date() 函数的语法如下: date(format,timestamp) 其中,form…

    PHP 2023年5月26日
    00
  • php自动加载的两种实现方法

    下面是针对“php自动加载的两种实现方法”的完整攻略。 PHP自动加载的两种实现方法 在PHP中,我们需要手动的引入需要使用的类文件,但是当引入大量的类文件时,就会出现部分文件重复引入,或是类名拼写错误等问题。所以,我们需要使用自动加载机制来避免这些问题的出现。PHP提供了两种常用的自动加载机制,分别是spl_autoload_register()和__au…

    PHP 2023年5月27日
    00
  • php木马webshell扫描器代码

    下面我会详细讲解如何编写 PHP 木马 webshell 扫描器代码。 步骤1:确定扫描的目标 首先我们需要确定扫描哪些目标,并建立一个可供程序访问的目标列表。比如,我们可以在程序中设定一个数组,列举出需要扫描的目标地址。 $targets = array( ‘http://www.example.com’, ‘https://www.example.org…

    PHP 2023年5月23日
    00
  • PHP基础知识介绍

    PHP基础知识介绍 在本文中,我们将介绍PHP的基础知识: 什么是PHP? PHP是一种通用开源脚本语言,主要用于Web开发并可以在HTML中嵌入使用。 PHP的优势 PHP易于学习和上手使用 具有广泛的软件和库支持 简单易用的语法 广泛应用于Web开发、企业系统和桌面应用程序 PHP的数据类型 PHP支持多种数据类型,包括字符串、整型、浮点数、布尔类型、数…

    PHP 2023年5月23日
    00
  • php中的buffer缓冲区用法分析

    PHP中的Buffer缓冲区用法分析 Buffer缓冲区是指在服务器端处理脚本时,不直接把内容输出到浏览器,而是先缓存到某个区域,直到脚本运行或缓冲区大小超过限制后再输出。 在PHP中,可以使用三种方式开启缓冲区:使用 ob_start() 函数手动开启缓冲区;在php.ini配置文件中设置output_buffering=On 隐式开启缓冲区;使用 ini…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部