业务经理

微信扫描以上二维码

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-09-14)
子站独立部署时修复同步附件失败问题
在线客服
在线客服(2026-09-13)
修复删除会话报错问题 删除会话时联动删除聊天图片
在线考试竞赛系统
在线考试竞赛系统(2026-09-12)
增加投票功能 考试功能拓展 注意:更新后需要执行系统更新,更新数...
网上信箱
网上信箱(2026-09-12)
修复新版本兼容问题
GeoSeo收录宝
GeoSeo收录宝(2026-09-12)
1 优化Update.php文件,解决版本在线升级不完整问题 2 ...
GeoSeo工具箱
GeoSeo工具箱(2026-09-11)
修正历史记录推送
微信系统
微信系统(2026-09-11)
增加数据统计总览界面 账号管理增加服务和公众号的区别 菜单管理支持更...
答题系统
答题系统(2026-09-11)
一站式在线答题系统,支持真题考试、题库练习和错题本,适合培训、考证、...
阿里云滑动验证码
阿里云滑动验证码(2026-09-10)
采用阿里云验证码替换迅睿系统自带的图片验证码和滑动验证码。后台设置方...
下载Plus
下载Plus(2026-09-09)
为网站附件下载加上“计数、限次、统计、防护”四重能力:按用户组控制下...