tp6 v3微信退款

php 复制代码
   /**
     * @Notes:退款
     * @param $out_trade_no 支付时候订单号(order表 original_bn)两个参数选一个这个要选对
     * @param $out_refund_no 退款订单号
     * @param $total 订单金额
     * @param $refund 退款金额
     * @Time: 2023-08-10
     */
    public function refundMoney($out_trade_no , $out_refund_no , $total , $refund)
    {
        $config = config('wechat.wechat');
        $time=time();
        $refundData=[
            'out_refund_no'=>$out_refund_no,	//退款订单号自己生成就好
            'reason'=>'商品退款',
            'notify_url'=>$config['pay']['refundNotifyUrl'],//退款回调地址
            'out_trade_no' => $out_trade_no,
            'amount'=>[
                'refund'=> $refund, //退款标价金额,单位为分,可以做部分退款
                'total'=> $total, //订单总金额,单位为分
                'currency'=>'CNY'
            ]
        ];
        $url='https://api.mch.weixin.qq.com/v3/refund/domestic/refunds';
        $urlarr = parse_url($url); //拆解为:[scheme=>https,host=>api.mch.weixin.qq.com,path=>/v3/pay/transactions/native]
        $mchid =$config['pay']['merchantId'];//商户ID
        $xlid = $config['pay']['serialNumber'];//证书序列号
        $refundData=json_encode($refundData);
        $nonce = $this->randomString();
        $key = $this->getSign($refundData,$urlarr['path'],$nonce,$time);
        $token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"',$mchid,$xlid,$nonce,$time,$key);
        $header  = array(
            'Accept: application/json',
            'Content-Type: application/json',
            'User-Agent:*/*',
            'Authorization: WECHATPAY2-SHA256-RSA2048 '.$token
        );
        $res=$this->curl_post_https($url,$refundData,$header);
        $res_array=json_decode($res,true);
        return $res_array;


    }
php 复制代码
   // 生成随机字符串
    private function randomString($len = 32)
    {
        $string = '';
        $char = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
        for ($i = 0; $i < $len; $i++) {
            $string .= $char[mt_rand(0, strlen($char) - 1)];
        }
        return $string;
    }


    //微信支付签名
    function getSign($data=array(),$url,$randstr,$time){
        $str = "POST"."\n".$url."\n".$time."\n".$randstr."\n".$data."\n";
        $key = file_get_contents(getcwd() .'/cert/apiclient_key.pem');//在商户平台下载的秘钥,读取到变量 最好是放到public下边 
        $str = $this->getSha256WithRSA($str,$key);
        return $str;
    }


    //加密
    public function getSha256WithRSA($content, $privateKey){
        $binary_signature = "";
        $algo = "SHA256";
        openssl_sign($content, $binary_signature, $privateKey, $algo);
        $sign = base64_encode($binary_signature);
        return $sign;
    }
    //退款用
    function curl_post_https($url,$data,$header){ // 模拟提交数据函数
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在,如果出错则修改为0,默认为1
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        $tmpInfo = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno'.curl_error($curl);//捕抓异常
        }
        curl_close($curl); // 关闭CURL会话
        return $tmpInfo; // 返回数据,json格式
    }

调用

php 复制代码
    $res = WxPay::instance()->refundMoney($order['original_bn'] , $order['order_bn'] , $sum , $order['total_money']);

        $msg = '';
        if (!empty($res['code'])) {
            $msg = $res['message'];
        }
        if (!empty($res['status'])) {
            if ($res['status'] == 'SUCCESS'){
                $msg = '退款成功';
            } else if ($res['status'] == 'CLOSED') {
                $msg = '退款关闭';
            } else if ($res['status'] == 'PROCESSING') {
                $msg = '退款处理中';
            } else if ($res['status'] == 'ABNORMAL') {
                $msg = '退款异常';
            }
        }
        return $msg;
相关推荐
特视界说1 天前
多规格产品动画怎么规划?把“一个型号一条片”改成可管理的内容架构
人工智能·安全·微信·新浪微博
悟空码字2 天前
视频号直播变了
微信·视频号
随性而行3603 天前
企业微信 Webhook 接收不到消息?网络连通性、URL 签名验签与 API 返回错误码排查指南
java·网络·人工智能·后端·微信·企业微信
未秃头的程序猿4 天前
同一个商户号,V2 免密代扣和 V3 分账的证书怎么共存?
java·后端·微信
木易 士心4 天前
Spring Boot 微信公众号后端服务开发实战指南
spring boot·后端·微信
linda`li6 天前
如何使用TRAE+Figma自动生成前端代码
微信·figma·自动写代码
随性而行3607 天前
企业微信 API 如何实现业务消息自动通知?接口应用场景解析
java·人工智能·后端·微信·机器人·企业微信
极客互动API7 天前
企业微信二次开发 API:如何与 SCRM 打通外部联系人的消息发送
微信·企业微信·企微scrm·企业微信api·企微外部联系人
随性而行36012 天前
企业微信API调用案例:如何通过接口实现多账号统一管理与业务接入?
运维·微信·机器人·自动化·企业微信