- 提现api怎么对接?
<?php declare(strict_types=1); namespace app\admin\controller; use app\model\CartModel; use think\facade\Db; use think\facade\Log; use think\facade\View; use think\Request; use WeChatPay\Builder; use WeChatPay\Crypto\Rsa; use WeChatPay\Util\PemUtil; class CashOut extends Common { public function initialize() { parent::initialize(); } public function index() { $type = input("type"); $id = input("param.id", 0, "intval"); if ($type == 2) { return $this->toYesRefund($id, 'index'); } else if ($type == 3) { return $this->toNoRefund($id, 2, 'index'); } else if ($type == 4) { return $this->toNoRefund($id, 6, 'index'); } $where = []; $key = input("param.key", "", "trim"); if ($key) { $where[] = [ "b.shop_name", "like", "%" . $key . "%" ]; $where[] = [ "b.name", "like", "%" . $key . "%" ]; $where[] = [ "c.shop_name", "like", "%" . $key . "%" ]; $where[] = [ "c.name", "like", "%" . $key . "%" ]; } $data = Db::table('do_commission_cash_out') ->fieldRaw('a.*,IF(a.obj_type = 0,b.shop_name,c.shop_name) shop_name , d.nickName') ->alias('a') ->leftJoin('do_shop b', 'a.obj_type = 0 and a.obj_id=b.id') ->leftJoin('do_proxy c', 'a.obj_type = 1 and a.obj_id=c.id') ->leftJoin('do_mini_user d', "a.uid = d.id") ->whereOr($where) ->group('a.id') ->orderRaw("FIELD(a.status,0) desc") ->order("a.id desc") ->paginate(); return view("index", [ "lists" => $data, "pages" => $data->render(), "key" => $key ] ); } private function toYesRefund($id, $url = 'detail') { $db_order = Db::table('do_commission_cash_out') ->where('id', $id) ->find(); if ($db_order['obj_type'] == 0) { $openid = Db::table('do_shop')->alias('a')->join('do_mini_user b', 'a.uid=b.id')->where('a.id', $db_order['obj_id'])->find(); } elseif ($db_order['obj_type'] == 1) { $openid = Db::table('do_proxy')->alias('a')->join('do_mini_user b', 'a.uid=b.id')->where('a.id', $db_order['obj_id'])->find(); } $data = system_config('mini_wx'); // $merchantId = '1602011899'; $apiclientKey = app()->getRootPath() . 'extend/cert/apiclient_key.pem'; $platformCert = app()->getRootPath() . 'extend/wx/cert/apiclient_cert.pem'; // 「商户API证书」的「证书序列号」 $merchantCertificateSerial = '61B970FC5E2A9C12C61070DE81CEF34088FB759E'; // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名 $merchantPrivateKeyFilePath = 'file://' . $apiclientKey; echo "私钥文件路径: ". $merchantPrivateKeyFilePath. "<br>"; // 检查文件是否存在 if (!file_exists($apiclientKey)) { echo "私钥文件不存在: ". $apiclientKey; exit; } $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE); // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名 $platformCertificateFilePath = 'file://' . $platformCert; echo "私钥文件路径: ". $platformCertificateFilePath. "<br>"; // 检查文件是否存在 if (!file_exists($platformCertificateFilePath)) { echo "私钥文件不存在: ". $platformCertificateFilePath; exit; } $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC); // 从「微信支付平台证书」中获取「证书序列号」 $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath); // 构造一个 APIv3 客户端实例 $instance = Builder::factory([ 'mchid' => $merchantId, 'serial' => $merchantCertificateSerial, 'privateKey' => $merchantPrivateKeyInstance, 'certs' => [ $platformCertificateSerial => $platformPublicKeyInstance, ], ]); $params ['appid'] = 'wx795d70d06bdda3c6'; $params [ 'out_batch_no' ] = $this->makeOutTradeNo("CA"); $params [ 'total_amount' ] = $db_order['price']; $params [ 'batch_name' ] = '收益提现'; $params [ 'batch_remark' ] = '收益提现'; $params [ 'total_num' ] = 1; $params [ 'transfer_detail_list' ][0] = ["out_detail_no"=>$this->makeOutTradeNo("CA"), "transfer_amount"=> $db_order['price'], "transfer_remark"=> "收益提现", "openid"=>$openid['openid'] ]; try { // 输出请求URL $requestUrl = 'https://api.mch.weixin.qq.com/v3/transfer/batches'; echo "请求URL: ". $requestUrl. "<br>"; // 输出请求头信息,这里假设Builder::factory会生成正确的请求头数组$headers // 实际中需要根据Builder::factory的实现来获取正确的请求头 $headers = []; echo "请求头: <pre>"; print_r($headers); echo "</pre><br>"; // 输出请求体 echo "请求体: <pre>"; echo json_encode($params, JSON_PRETTY_PRINT); echo "</pre><br>"; $res = $instance->chain('v3/transfer/batches')->post(['json' =>$params]); // 输出响应状态码 echo "响应状态码: ". $res->getStatusCode(). "<br>"; // 输出响应头 echo "响应头: <pre>"; print_r($res->getHeaders()); echo "</pre><br>"; // 输出响应体 echo "响应体: <pre>"; echo $res->getBody(); echo "</pre><br>"; if ($res->getStatusCode() == 200) { // 更新数据库状态等操作 $data = [ "id" => $id, "status" => 1, 'type' => $openid['CashOutType'], 'BankCard' => $openid['CashOutType'] == 2 ? $openid['BankCard'] : null, 'BankCardName' => $openid['name'], 'uid' => $openid['CashOutType'] == 1 ? $openid['id'] : null ]; Db::table('do_commission_cash_out') ->where("id", $id) ->update($data); $result = [ "code" => 0, "data" => $res, "msg" => "提现成功", 'url' => (string)url('') ]; } } catch (\Exception $e) { // 输出异常信息 echo "异常信息: ". $e->getMessage(). "<br>"; echo "异常文件: ". $e->getFile(). "<br>"; echo "异常行号: ". $e->getLine(). "<br>"; // 返回错误信息 /* try{ $res = $instance->chain('v3/transfer/batches')->post(['json' =>$params]); if ($res->getStatusCode() == 200) { $data = [ "id" => $id, "status" => 1, 'type' => $openid['CashOutType'], 'BankCard' => $openid['CashOutType'] == 2 ? $openid['BankCard'] : null, 'BankCardName' => $openid['name'], 'uid' => $openid['CashOutType'] == 1 ? $openid['id'] : null ]; Db::table('do_commission_cash_out') ->where("id", $id) ->update($data); $result = [ "code" => 0, "data" => $res, "msg" => "提现成功", 'url' => (string)url('') ]; } } catch (\Exception $e) { $message = $e->getMessage(); // 进行错误处理 $result = [ "code" => 1, "msg" => $message, 'url' => (string)url('') ]; }*/ $result = [ "code" => 1, "msg" => $message, 'url' => (string)url('') ]; } return json($result); } private function toNoRefund($id, $out_refund_status) { $data = Db::table("do_commission_cash_out") ->where("id", $id) ->where('status', '0') ->update(["status" => 2]); if ($data == 1) { $return = ['code' => 0, 'msg' => '操作成功']; } else { $return = ['code' => 1, 'msg' => '操作失败']; } return json($return); } private function makeOutTradeNo($order_type = '', $uid = ''): string { return strtoupper($order_type) . date('YmdHis') . str_pad((string)$uid, 5, '0') . random_int( 11111, 99999 ); } public function export() { $where = []; $key = input("param.key", "", "trim"); if ($key) { $where[] = [ "b.shop_name", "like", "%" . $key . "%" ]; $where[] = [ "b.name", "like", "%" . $key . "%" ]; $where[] = [ "c.shop_name", "like", "%" . $key . "%" ]; $where[] = [ "c.name", "like", "%" . $key . "%" ]; } $data = Db::table('do_commission_cash_out') ->fieldRaw("a.id, FROM_UNIXTIME (a.inserttime) inserttime, CASE a.`obj_type` WHEN 0 THEN '店铺' WHEN 1 THEN '代理' ELSE a.`obj_type` END obj_type, IFNULL(b.shop_name,c.shop_name) shop_name, a.price / 100 price, CASE a.`status` WHEN 0 THEN '待审核' WHEN 1 THEN '已同意' WHEN 2 THEN '已驳回' ELSE a.`status` END status ") ->alias('a') ->leftJoin('do_shop b', 'a.obj_type = 0 and a.obj_id=b.id') ->leftJoin('do_proxy c', 'a.obj_type = 1 and a.obj_id=c.id') ->whereOr($where) ->group('a.id') ->orderRaw("FIELD(a.status,0)") ->order("a.id") ->select() ->toArray(); $header = ['ID', '申请时间', '类型', '名称', '提现金额', '审批状态']; downloadExcel($header, $data, "提现记录"); } }请求报错说是签名不匹配
03-14 - 调用微信接口,我听说官方封装有专门的库,请问封装的库在哪里?
我的小程序需要调用接口,我自己写的是用curl去请求,听说官方有专门的库区调用接口,这个库在哪里啊
03-13 - 客户点击提现,商户同意客户提现,这个过程实例包含哪些参数进行请求,并且商户同意用户提现调用的是哪个接
客户点击提现,商户同意客户提现,这个过程实例包含哪些参数进行请求(这些参数怎么获得,比如需要人工输入储存与微信匹配的电话号码一起发送请求吗),还有请求实例格式是怎么样的,并且商户同意用户提现调用的是哪个接口,我应该怎么去看开发文档,我的小程序后端语言是php,我是新手小白第一次使用这个接口,请大神能够详细指引
03-12