业务经理

微信扫描以上二维码

028-61286886

技术咨询

请教自定义付款一个问题看到文档中自定义付款示例如下

迅睿框架 更新 2020-04-02 19:02:30 rewalax

请教自定义付款(https://www.xunruicms.com/doc/458.html)一个问题。

看到官方文档中自定义付款示例如下:

<?php namespace Phpcmf\Model\App; // 这里需要把App改成项目目录名称

// 付款模型示例
class Buy extends \Phpcmf\Model
{

    private $row;

    // 付款表单格式
    public function get_myfield() {

        return [
            'fieldtype' => 'Pay', // 字段类型
            'fieldname' => 'price',
            'setting' => [
                'option' => [
                    'payfile' => 'buy.html', // 模板文件
                    'is_finecms' => 1, // 是否启用余额付款
                ],
            ]
        ];
    }

    // 付款类型名称
    public function paytype() {
        return  '<span class="label label-danger"> 测试 </span>'; // 最好2个汉字表述
    }
    
    // 付款前的权限验证,返回null表示可进行付款,返回字符串是就输出字符串
    // $id 记录id; $paylog 支付表记录数组; $num 数量; $sku 自定义属性
    public function pay_before($id, $num, $sku, $siteid) {
    	return '';
    }

    // 付款价格
    // $id 记录id; $num 数量; $sku 自定义属性; $siteid 站点id
    public function get_price($id, $num, $sku, $siteid) {

        // 计算付款价格
        $data = $this->_get_row($id, $siteid);

        return $data['price']; // 测试200
    }

    // 付款数据
    // $id 记录id; $num 数量; $sku 自定义属性; $siteid 站点id
    public function get_row($id, $num, $sku, $siteid) {

        // 查询数据记录,判断是否存在
        $data = $this->_get_row($id, $siteid);

        return [
            'price' => $this->get_price($id, $num, $sku, $siteid),
            'title' => '支付记录标题'.$data['title'],
            'sell_uid' => 0, // 商家uid
            'sell_username' => '', // 商家账号
        ];
    }

    // 付款成功
    // $id 记录id; $paylog 支付表记录数组; $num 数量; $sku 自定义属性
    public function success($id, $paylog, $num, $sku) {

        // 支付成功之后的回调处理动作
        $data = $this->_get_row($id, $paylog['site']);

    }

    // 根据id查询表数据
    // $id 记录id;  $siteid 站点id
    private function _get_row($id, $siteid) {

        if (isset($this->row[$id]) && $this->row[$id]) {
            return $this->row[$id];
        }

        $this->row[$id] = $this->table('test')->get($id);

        return $this->row[$id];
    }
    
    
    // 付款成功跳转URL
    // $id 记录id; $paylog 支付表记录数组
    public function call_url($id, $paylog) {
        return dr_url_prefix("/index.php"); // 跳转url
    }
}

这段代码中get_price()是针对数据库已经有具体定价然后通过数据库读取定价再进行支付调用,我这边的需求是用户自行输入金额(类似打赏),而不是从数据库中get_price(),请问如何实现?试了下$post和\Phpcmf\Service::L('input') 都获取不到post 的值。

其实功能需求就是类似官方的donation(模块内容打赏)插件,但因为官方的插件代码都集成到框架中了,所以不能仿照,请各位大大不吝赐教。


方案

  • rewalax #1 · 2020-04-02 17:32:18
    补充:类似下图,调用支付以后需要自行填写金额
    image
    然后点击付款的时候因为获取不到post的值而提示金额不规范。
    image
  • 小黄人 18html.com #2 · 2020-04-02 17:34:25
    我记得,充值那里是有自定义金额的
  • 小黄人 18html.com #3 · 2020-04-02 17:35:52

    image
  • 易学习 #4 · 2020-04-02 17:36:24
    这个简单啊,将用户输入的金额存储到本地缓存中,get_price就读缓存金额,我做过这种,类似打赏
  • rewalax #5 · 2020-04-02 17:37:05
    小黄人 18html.com 是想自定义开发,但是看官方的文档接口获取不到post的自定义金额
  • 琉惗 #6 · 2020-04-02 17:37:56
    ajax传过去不就好了
  • rewalax #7 · 2020-04-02 17:39:47
    易学习 这个官方的接口不能获取post的值么?感觉用缓存存提交的数据不是个好办法吧
  • 靠悬赏赚钱买授权 #8 · 2020-04-02 17:40:39
    四楼思路对,我也是这样开发的,get_price不能获取post,但get_price可以获取到缓存值
  • rewalax #9 · 2020-04-02 17:44:31
    靠悬赏(设置悬赏)赚钱买授权 但是官方调用的时候就一个
    {dr_payform("my-test_buy-111")}
    缓存用户输入的内容还得再写个控制器吧,感觉绕路了,或者您说的缓存具体怎么实现,麻烦明示一下。
  • 易学习 #10 · 2020-04-02 17:48:31
    楼主不会举一反三,post变量改成你自己的
    // 付款前的权限验证,返回null表示可进行付款,返回字符串是就输出字符串
        // $id 记录id; $paylog 支付表记录数组; $num 数量; $sku 自定义属性
        public function pay_before($id, $num, $sku, $siteid) {
            \Phpcmf\Service::L('cache')->set_data("test".\Phpcmf\Service::L('input')->get_user_agent().$this->uid, $_POST['post值'], 60);
        	return '';
        }
    
        // 付款价格
        // $id 记录id; $num 数量; $sku 自定义属性; $siteid 站点id
        public function get_price($id, $num, $sku, $siteid) {
    
            return \Phpcmf\Service::L('cache')->get_data("test".\Phpcmf\Service::L('input')->get_user_agent().$this->uid);
        }
  • 易学习 #11 · 2020-04-02 17:51:36
    pay_before
    就可以读取用户输入的值,然后存储这个值,赋值给支付变量,逻辑很简单
  • rewalax #12 · 2020-04-02 17:54:12
    易学习 感谢回复,但是
     public function pay_before($id, $num, $sku, $siteid) {
            \Phpcmf\Service::L('cache')->set_data("test".\Phpcmf\Service::L('input')->get_user_agent().$this->uid, $_POST['post值'], 60);
        	return '';
        }
    这里的$_POST就获取不到值,是我哪里不对吗?
  • 易学习 #13 · 2020-04-02 17:55:17
    模板不对
    // 付款表单格式
        public function get_myfield() {
    
            return [
                'fieldtype' => 'Pay', // 字段类型
                'fieldname' => 'price',
                'setting' => [
                    'option' => [
                        'payfile' => 'aaaaaaaaa.html', // 模板文件
                        'is_finecms' => 1, // 是否启用余额付款
                    ],
                ]
            ];
        }
    aaaaaa.html模板是支付模板,你要把输入框写在这个模板里面,我记得是config/pay/aaaaaaa.html新建
  • rewalax #14 · 2020-04-02 17:55:18
    易学习 为什么我在pay_before里也获取不到post,无语了。。。
  • rewalax #15 · 2020-04-02 17:56:45
    易学习 模板也没问题啊
    image

    image
  • 易学习 #16 · 2020-04-02 18:06:07
    好像是我把函数写错了,我晚上回家看看我电脑以前的代码
  • 易学习 #17 · 2020-04-02 18:14:17
    满意答案
     // 付款前的权限验证,返回null表示可进行付款,返回字符串是就输出字符串
        // $id 记录id; $paylog 支付表记录数组; $num 数量; $sku 自定义属性
        public function pay_before($id, $num, $sku, $siteid) {
    		
        	return '';
        }
    
        // 付款价格
        // $id 记录id; $num 数量; $sku 自定义属性; $siteid 站点id
        public function get_price($id, $num, $sku, $siteid) {
    
            return \Phpcmf\Service::L('cache')->get_data("test".\Phpcmf\Service::L('input')->get_user_agent().$this->uid);
        }
    
        // 付款数据
        // $id 记录id; $num 数量; $sku 自定义属性; $siteid 站点id
        public function get_row($id, $num, $sku, $siteid) {
    
    		if ($_POST) {
    			\Phpcmf\Service::L('cache')->set_data("test".\Phpcmf\Service::L('input')->get_user_agent().$this->uid, $_POST['pay']['money'], 60);
    		}
    
            // 查询数据记录,判断是否存在
            $data = $this->_get_row($id, $siteid);
    
            return [
                'price' => $this->get_price($id, $num, $sku, $siteid),
                'title' => '支付记录标题'.$data['title'],
                'sell_uid' => 0, // 商家uid
                'sell_username' => '', // 商家账号
            ];
        }
    支付的html是
    <div class="form-group">
                <label class="col-md-3 control-label">支付金额</label>
                <div class="col-md-2">
                    <input type="text" name="pay[money]" value="" class="form-control">
                </div>
            </div>
    post一定要是
    pay[money]
    还好电脑有笔记
  • rewalax #18 · 2020-04-02 19:02:30
    @易学习:非常感谢,易大师果然大师,哈哈

迅睿系统漏洞

外贸多语言建站
外贸多语言建站(2026-10-30)
修正对百度编辑器提取支持
AI文章生成器
AI文章生成器(2026-10-29)
任务插图设置数量
Bing站长数据
Bing站长数据(2026-10-29)
根据BING接口调整菜单 各个页面数据支持点击查看详情
按字段付费
按字段付费(2026-10-29)
按字段付费用于模块的字段设置一定的价格,当用户购买了此内容的字段时才...
泛解析站群系统
泛解析站群系统(2026-10-29)
AI队列增加清空按钮 表单提示语收敛 目录模式不接管主域名模板
自定义收款/捐款
自定义收款/捐款(2026-10-28)
自定义收款或捐款插件可以让用户快速创建付款或者捐款功能
CMS内容批量修改
CMS内容批量修改(2026-10-28)
后台批量修改文章内容的指定字段在插件后台可以任意指定字段
全站模块搜索
全站模块搜索(2026-10-28)
实现全模块一次性搜索内容,一键搜索全站内容精准搜索全部模块:
PHPCMSV9数据转换
PHPCMSV9数据转换(2026-10-28)
PHPCMS转入迅睿CMS操作步骤:https://www.xunr...
域名授权系统
域名授权系统(2026-10-28)
后台增加前台访问地址链接