求助 版主:官方研发技术组
请教自定义付款一个问题看到文档中自定义付款示例如下
类型:迅睿CMS 更新时间:2020-04-02 19:02:30

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

    image
  • 易学习
    #4楼    易学习
    2020-04-02 17:36:24
    Chrome 0
    这个简单啊,将用户输入的金额存储到本地缓存中,get_price就读缓存金额,我做过这种,类似打赏
  • rewalax
    #5楼    rewalax
    2020-04-02 17:37:05
    Chrome 0
    小黄人 18html.com 是想自定义开发,但是看官方的文档接口获取不到post的自定义金额
  • 琉惗
    #6楼    琉惗
    2020-04-02 17:37:56
    Chrome 0
    ajax传过去不就好了
  • rewalax
    #7楼    rewalax
    2020-04-02 17:39:47
    Chrome 0
    易学习 这个官方的接口不能获取post的值么?感觉用缓存存提交的数据不是个好办法吧
  • 靠悬赏赚钱买授权
    #8楼    靠悬赏赚钱买授权
    2020-04-02 17:40:39
    Chrome 0
    四楼思路对,我也是这样开发的,get_price不能获取post,但get_price可以获取到缓存值
  • rewalax
    #9楼    rewalax
    2020-04-02 17:44:31
    Chrome 0
    靠悬赏(设置悬赏)赚钱买授权 但是官方调用的时候就一个
    {dr_payform("my-test_buy-111")}
    缓存用户输入的内容还得再写个控制器吧,感觉绕路了,或者您说的缓存具体怎么实现,麻烦明示一下。
  • 易学习
    #10楼    易学习
    2020-04-02 17:48:31
    Chrome 0
    楼主不会举一反三,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
    Chrome 0
    pay_before
    就可以读取用户输入的值,然后存储这个值,赋值给支付变量,逻辑很简单
  • rewalax
    #12楼    rewalax
    2020-04-02 17:54:12
    Chrome 0
    易学习 感谢回复,但是
     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
    Chrome 0
    模板不对
    // 付款表单格式
        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楼    rewalax
    2020-04-02 17:55:18
    Chrome 0
    易学习 为什么我在pay_before里也获取不到post,无语了。。。
  • rewalax
    #15楼    rewalax
    2020-04-02 17:56:45
    Chrome 0
    易学习 模板也没问题啊
    image

    image
  • 易学习
    #16楼    易学习
    2020-04-02 18:06:07
    Chrome 0
    好像是我把函数写错了,我晚上回家看看我电脑以前的代码
  • 易学习
    #17楼    易学习
    2020-04-02 18:14:17
    Chrome 0
     // 付款前的权限验证,返回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楼    rewalax
    2020-04-02 19:02:30
    Chrome 0
    @易学习:非常感谢,易大师果然大师,哈哈