码支付添加银行转账功能,手动回调

news2024/11/19 17:36:07

在后台中通道列表先加上

路径:【后台】 - > 【通道管理】 - > 【新增】
image.png
总后台页面通道类型加上支付类型yh_pay和通道yhzz添加后存到数据库admin_chanel
image.png

修改商户页面的【新增通道】页面

/view/index/channel/index.html

image.png
添加一个支付通道

<option value="yh_pay">银行转账</option>

通道列表添加完整

<!--===============-->
<div class="col-12" id="yh_qq">
  <label class="form-label">开户银行</label>
  <input
    type="text"
    name="wx_guid"
    class="form-control"
    placeholder="请输入您的开户行,如:【中国工商银行昆明大观支行】"
    />
</div>
<div class="col-12" id="yh_kalenick">
  <label class="form-label">银行开户名</label>
  <input
    type="text"
    name="wxname"
    class="form-control"
    placeholder="银行开户名(个人用户填姓名即可)如:【杨明金】"
    />
</div>
<div class="col-12" id='yh_zfbpid'>
  <label class="form-label">银行卡号</label>
  <input
    type="text"
    name="qr_url"
    id="qr_url"
    class="form-control"
    placeholder="必须输入完整的银行卡号(不要有空格)"
    />
</div>
<!--===============-->

image.png
对应字段最后添加到数据库ypay_account

yh_qq
yh_kalenick
yh_zfbpid

image.png
列表的标题

yh_pay: { title: '银行转账', class: ' bg-label-warning' },

返回列表中需要显示的字段

{
  // Label
  targets: 3,
    render: function (data, type, full, meta) {
    var $code = full['code'];
    var $type = full['type'];
    if($type == 'wxpay'){
      if($code == 'wxpay_dy'){
        return  full['wxname'];
      }
      return full['wx_guid'];
    }else if($type == 'alipay'){
      return full['zfb_pid'];
    }else if($type == 'qqpay'){
      return full['qq'];
    } else if ($type == 'yh_pay') {
      return full['wxname'] + ' ' + full['qr_url'];
    }
  }
}

image.png
隐藏列表和显示

else if(code == 'yhzz'){
  $("#yh_qq").show();
  $("#yh_kalenick").show();
  $("#yh_zfbpid").show();
}

设置不可点击更新

render: function (data, type, full, meta) {
  var id = full['id'];
  var code = full['code'];
  var arr = [id,"'" + full['type'] + "'","'" + code + "'","'" + full['qq'] + "'"];
  var del = '<button type="button" οnclick="del('+id+')" class="btn rounded-pill btn-sm btn-google-plus">删除</button>';
  if(code == "alipay_app" || code == "wxpay_app" || code == "alipay_dmf" || code == "wxpay_zg" || code == "alipay_pc" || code == "alipay_mck" || code == "yhzz"){
    return (
      '<button type="button"  class="btn rounded-pill btn-sm btn-twitter" style="pointer-events:none;">更新</button>&nbsp;'+
      del
    ); 
  }else if(code == 'qqpay_cloud'){
    return (
      '<button type="button" data-bs-toggle="modal" data-bs-target="#upQQChannel" οnclick="update('+arr+')" class="btn rounded-pill btn-sm btn-twitter">更新</button>&nbsp;'+
      del
    ); 
  }else{
    return (
      '<button type="button" data-bs-toggle="modal" data-bs-target="#upChannel" οnclick="update('+arr+')" class="btn rounded-pill btn-sm btn-twitter">更新</button>&nbsp;'+
      del
    ); 
  }
}

修改商户页面的订单页,显示订单和手动回调按钮

/view/index/deal/orderlog.html

支付后的订单显示到这里

yh_pay: { title: '银行转账', class: ' bg-label-warning' },

image.png

后台管理界面的账号管理

/view/admin/ypay/account/index.html

<select name="type">
  <option value="">请选择一个通道</option>
  <option value="alipay">支付宝</option>
  <option value="wxpay">微信</option>
  <option value="qqpay">QQ</option>
  <option value="yh_pay">银行转账</option>
  </select>  

列表页也要改

render: function (data, type, full, meta) {
  var $type = full['type'];
  var $array = {
    wxpay: { title: '微信', class: 'bg-label-success' },
    alipay: { title: '支付宝', class: ' bg-label-info' },
    qqpay: { title: 'QQ', class: ' bg-label-danger' },
    yh_pay: { title: '银行转账', class: ' bg-label-warning' },
  };
}
else if ($type == 'yh_pay') {
  return full['wxname'] + ' ' + full['qr_url'];
}

通道类型中需要加

field: "type",
title: "通道类型",
unresize: "true",
align: "center",
templet: function (d) {
    var strs = {
        'alipay': '支付宝',
        'wxpay': '微信',
        'qqpay':'QQ',
        'yh_pay':'银行转账',
        
    };
    return strs[d.type];
}

支付测试页面对接支付通道

/view/index/demo/index.html

测试页面加一下图标

<div class="borders yh_pay">
  <p><img src="/static/index/images/demo/wypay.png" style="margin:0 auto;width:110px" alt=""/> </p>
</div>

image.png
选择效果js

$('.yh_pay').on('click',function () {
  $('.yh_pay').addClass('click_active');
  $('.wechat_pay').removeClass('click_active');
  $('.ali_pay').removeClass('click_active');
  $('.qq_pay').removeClass('click_active');
  flag = 1;
  type = 'yh_pay';
  out_trade_no=out_trade_no;
});

手机端支付页面添加银行转账支付选项

/view/index/demo/mobile.html

手机端图标

  $("#yh_pay").on('click', function () {
    pay("yh_pay");
  });
<div class="yh_pay paytest"> 
  <div class="pay-item-box" id="wxpay">
    <div class="icon">
      <img src="static/index/images/demo/wypay-icon.svg" alt="yh_pay">
    </div>
    <p>银行转账</p>
  </div>
</div>

改一下业务逻辑层,相关数据存到订单数据库

/app/common/service/Jialanshen.php

//银行卡转账
public static function yhzz($trade_no,$QR_row,$data,$user)
{
    // 站点名称处理
     $basic = basic::where('user_id',$user['id'])->find();
    if(empty($data['sitename'])){
        $data['sitename'] = "";
    }
    // 处理金额
    $money = $data['money'];
    while(true)
    {
        $ods = M::where('truemoney',$money)->where('status',0)->where('account_id',$QR_row['id'])->where('out_time','>',time())->order('id desc')->find();
        if(empty($ods))
        {
            break;
        }
        else
        {
            $money = $money + "0.01";
        }
    }
    // 计算费率金额
    $feilv_money = $data['money'] * $user['feilv'] / 100;
    $account = Db::name('ypay_account')->where('qr_url', $QR_row['qr_url'])->find();//获取收款信息
    $odmodels = [
        'name' => $data['name'],
        'sitename' => $data['sitename'],
        'type' => 'yh_pay',
        'account_id' => $QR_row['id'],
        'trade_no' => $trade_no,
        'out_trade_no' => $data['out_trade_no'],
        'notify_url' => $data['notify_url'],
        'return_url' => $data['return_url'],
        'user_id' => $user['id'],
        'money' => $data['money'],
        'truemoney' => $money,
        'feilvmoney' => $feilv_money,
        'status' => '0',
        'create_time' => date('Y-m-d H:i:s', time()),
        'qrcode' => $QR_row['qr_url'], // 收款账号
        'h5_qrurl' => $account['wxname'], // 收款人姓名
        'alipay_order_no' => $QR_row['wx_guid'], // 收款银行
        'ip' => get_client_ip(),
        'out_time' => time() + $basic['timeout_time'],
    ];
    // 尝试创建新订单
    try {
        M::create($odmodels); 
        return true;
    }catch (\Exception $e){
        return false;
    }
    
}

use app\common\model\YpayOrder as M;
M::create($odmodels);
最终创建了订单存到数据库yapy_order
image.png

前端控制层处理信息,显示支付页面

/view/index/pay/console.html

如果支付类型是银行转账显示银联图标

{if condition="$order.type == 'yh_pay'"}
	<p><img src="/static/index/pay/console/images/wypay.png" alt="" style="height:30px;"></p>
{/if}

如果是银行转账显示对应信息

  {if condition="$order.type == 'yh_pay'"}
      <center>
          <p class="yhpay" id="alipay_order_no" style="font-weight:bold;color:green;font-size: 19px;">开户银行:{$order.alipay_order_no}</p>
          <p class="yhpay" id="h5_qrurl" style="font-weight:bold;color:green;font-size: 19px;">收款人:{$order.h5_qrurl}</p>
          <p class="yhpay" id="qrcodes" style="font-weight:bold;color:green;font-size: 30px;" >银行卡号:{$order.qrcode}</p>
          <button id="card_copy" class="layui-btn layui-btn-default card_copy" data-clipboard-text="{$order.qrcode}">复制卡号</button>
      </center>
  {/if}

image.png
隐藏其他方式的收款二维码

{if condition="$order.type != 'yh_pay'"}
    <center>
        <p class="qrcode" id="qrcode">
            <img class="kalecloud" id="qrcode_load" src="/static/index/images/status/loading.gif" style="display: block;">
        </p>
    </center>
    
{/if}

功能性提示

{if condition="$order.type == 'yh_pay'"}
    <p>请使用银行卡进行转账后等待</p>
{/if}

大图

  {if condition="$order.type == 'yh_pay'"}
      <img src="/static/index/pay/console/images/wxpay-sys.png" alt="">
  {/if}

主页事项页面

  {if condition="$order.type == 'yh_pay'"}
      <h3 style="font-weight: bold;text-align: center;font-size: 30px;">转账支付注意</h3>
  {/if}  

二维码的逻辑,可不用

if ("{$order.type}"== 'yh_pay')
{
  if(isMobilCheck())
  {

    $("#startApp").attr("href", "{$order.h5_qrurl|raw}");
    $("#startApp").show();
    $("#startApp_text").show();
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法训练-数组 三】【数组矩阵】螺旋矩阵、旋转图像、搜索二维矩阵

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是螺旋矩阵&#xff0c;使用【二维数组】这个基本的数据结构来实现 螺旋矩阵【EASY】 二维数组的结构特性入手 题干 解题思路 根据题目示例 mat…

【DevOps】搭建你的第一个 Docker 应用栈

搭建你的第一个 Docker 应用栈 1.Docker 集群部署2.第一个 Hello World2.1 获取应用栈各节点所需镜像2.2 应用栈容器节点互联2.3 应用栈容器节点启动2.4 应用栈容器节点的配置2.4.1 Redis Master 主数据库容器节点的配置2.4.2 Redis Slave 从数据库容器节点的配置2.4.3 Redis 数…

sql server查询结果:行转列、XML形式

1.普通查询 SELECT M.name From Menu M INNER JOIN MenuRoleRelation MRR ON M.idmrr.MenuId AND MRR.RoleId1; 结果&#xff1a; 2.做xml字符串返回 最后面加上&#xff1a;FOR XML PATH() 结果&#xff1a; 3.可以改为逗号分隔 SELECT ,M.name From Menu M INNER JOIN Me…

深度学习——深度学习计算一

深度学习——深度学习计算一 文章目录 前言一、层和块1.1. 自定义块1.2. 顺序块1.3. 在前向传播函数中执行代码1.4. 小结 二、参数管理2.1. 参数访问2.1.1. 目标参数2.1.2. 一次性访问所有参数2.1.3. 从嵌套块收集参数 2.2. 参数初始化2.2.1. 内置初始化2.2.2. 自定义初始化 2.…

常用Redis界面化软件

对于Redis的操作&#xff0c;前期有过介绍【Centos 下安装 Redis 及命令行操作】。而在Redis的日常开发调试中&#xff0c;可使用可视化软件方便进行操作。 本篇主要介绍Redis可视化的两款工具&#xff1a;Redis Desktop Manager和AnotherRedisDesktopManager。 1、Redis Desk…

unity 控制玩家物体

创建场景 放上一个plane&#xff0c;放上一个球 sphere&#xff0c;假定我们的球就是我们的玩家&#xff0c;使用控制键w a s d 来控制球也就是玩家移动。增加一个材质&#xff0c;把颜色改成绿色&#xff0c;把材质赋给plane&#xff0c;区分我们增加的白球。 增加组件和脚…

POJ 2104 K-th Number 平方分割 / 线段树

一、题目大意 长度为n&#xff08;n<100000&#xff09;的数组&#xff0c;进行m次查询&#xff08;m<5000&#xff09;&#xff0c;每次查询时&#xff0c;输入为 i j k&#xff0c;返回为数组 [i,j] 的分片里第k大数字&#xff08;1<i<j<n,k<j-i1) 二、解…

轻松实现视频、音频、文案批量合并,享受批量剪辑的便捷

在日常生活中&#xff0c;我们经常会需要将多个视频、音频和文案进行合并剪辑&#xff0c;以制作出符合我们需求的短视频。然而&#xff0c;这个过程通常需要花费大量的时间和精力。幸运的是&#xff0c;现在有一款名为“固乔智剪软件”的工具可以帮助我们轻松完成这个任务。 首…

mac怎么卸载软件没有叉的那种,别慌看这里

ac电脑对于很多人来说是一个高效、优雅的工作工具&#xff0c;但就像所有电子设备一样&#xff0c;有时候也需要进行软件的添加和删除以保持其最佳性能。然而&#xff0c;对于一些特殊类型的软件—也就是那些没有"叉"标志来直接卸载的—如何正确地从Mac上删除它们呢&…

RK3568笔记一:RKNN开发环境搭建

若该文为原创文章&#xff0c;转载请注明原文出处。 由于对AI的好奇&#xff0c;想要学习如何部署AI&#xff0c;所以从RV1126到RK3568中过渡。 一、介绍 RK3568开发板使用的是正点原子新出的ATK-DLRK3568 开发板&#xff0c;主要是学习从训练到部署的全过程&#xff0c;并记…

One Thread One Loop主从Reactor模型⾼并发服务器

One Thread One Loop主从Reactor模型⾼并发服务器 文章目录 One Thread One Loop主从Reactor模型⾼并发服务器一些补充HTTP服务器Reactor 模型eventfd通用类Any 目标功能模块划分&#xff1a;SERVER模块Buffer模块&#xff1a;编写思路&#xff1a;接口设计&#xff1a;具体实现…

Go Gin Gorm Casbin权限管理实现 - 3. 实现Gin鉴权中间件

文章目录 0. 背景1. 准备工作2. gin中间件2.1 中间件代码2.2 中间件使用2.3 测试中间件使用结果 3. 添加权限管理API3.1 获取所有用户3.2 获取所有角色组3.3 获取所有角色组的策略3.4 修改角色组策略3.5 删除角色组策略3.6 添加用户到组3.7 从组中删除用户3.8 测试API 4. 最终目…

FreeRTOS入门教程(队列的概念及相关函数介绍)

文章目录 前言一、队列概念二、队列的使用方法1.创建队列动态创建静态创建 2.复位队列3.删除队列4.写队列5.读队列6.查询队列7.覆盖/查看覆盖查看 总结 前言 本篇文章将带大家学习FreeRTOS中的队列&#xff0c;掌握什么是队列&#xff0c;并且学习如何使用队列&#xff0c;在什…

集成学习

集成学习&#xff08;Ensemble Learning) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/27689464集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型&#xff0c;集成学习潜在的思想是即便某一个弱分类器得到了错误的预测&#xff0c;其他的弱分类器…

Pytorch基础:Tensor的permute方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html 在Pytorch中&#xff0c;permute是Tensor的一个重要方法&#xff0c;同时它也是一个torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.permute(*dims) → Tensor torch.perm…

PbootCMS SQL注入漏洞

漏洞复现 访问漏洞url 数据库是mysql 构造payload&#xff0c;条件为假时&#xff0c;未查到任何数据 http://x.x.x/index.php?search 1select 0页面回显 构造payload&#xff0c;条件为真时&#xff0c;查询到数据 1select1文笔生疏&#xff0c;措辞浅薄&#xff0c;望各…

邮箱注册实现(二)注册接口实现

如果邮箱地址错误或非法&#xff0c;运行时会报错。因此需要增加校验&#xff1a; Validated RestController RequestMapping("/api/auth") public class AuthorizeController {ResourceAccountService service;GetMapping("/ask-code")public RestBean&l…

typescript 类型声明文件

typescript 类型声明文件概述 在今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。这些第三方库不管是否是用TS编写的&#xff0c;最终都要编译成JS代码&#xff0c;才能发布给开发者使用。6我们知道是TS提供了类型&#xff0c;才有了代码提示和类型保护等机…

R实现数据分布特征的视觉化——多笔数据之间的比较

大家好&#xff0c;我是带我去滑雪&#xff01; 如果要对两笔数据或者多笔数据的分布情况进行比较&#xff0c;Q-Q图、柱状图、星形图都是非常好的选择&#xff0c;下面开始实战。 &#xff08;1&#xff09;绘制Q-Q图 首先导入数据bankwage.csv文件&#xff0c;该数据集…

[MIT6.824] Lab 3: Fault-tolerant Key/Value Service

[MIT6.824] Lab 3: Fault-tolerant Key/Value Service 目标 通过在Lab2中实现的Raft库&#xff0c;构建一个可容灾的KV数据库。 需要实现的服务有三种操作: Put(key, value) key和value都是string&#xff0c;put设置指定key的value. Append(key, arg) 将arg append到key对…