文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-01 16:56

关注

目录

一、日常填坑:注意事项

二、代码示例

1.微信服务层

2.请求层

总结


一、日常填坑:注意事项

转账低于5毛会失败

转账金额需要自己取整一下,不然运气来了会出现以下问题

  {       "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值';        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;    }        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://blog.csdn.net/arlene12345/article/details/127906415

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯