You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:在OpenPOS系统中集成Swish支付二维码

在OpenPOS中集成Swish支付二维码的钩子实现

以下是基于op_add_order_after动作钩子的完整集成逻辑,结合你已有的Swish支付网关代码实现二维码展示:

核心钩子代码

// 挂载OpenPOS订单创建后的动作钩子
add_action('op_add_order_after', 'display_swish_qr_code_after_order', 10, 1);

function display_swish_qr_code_after_order($order) {
    // 仅当订单选择Swish支付时执行
    if ($order->get_payment_method() !== 'swish') {
        return;
    }

    // 提取订单关键参数(根据你的Swish API要求调整)
    $order_total = $order->get_total();
    // Swish API通常要求金额以最小货币单位(如瑞典克朗的öre)提交,需乘以100
    $swish_amount = (int)($order_total * 100);
    $order_id = $order->get_id();
    $merchant_number = '你的Swish商户号'; // 建议从网关配置中读取,不要硬编码
    $callback_url = admin_url('admin-ajax.php?action=swish_payment_callback&order_id=' . $order_id);

    // 调用你已有的Swish网关生成二维码
    // 替换为你实际的Swish网关类和方法
    $swish_gateway = new Swish_Payment_Gateway();
    $qr_response = $swish_gateway->create_payment_and_get_qr([
        'amount' => $swish_amount,
        'orderNumber' => $order_id,
        'callbackUrl' => $callback_url,
        'payeeAlias' => $merchant_number
    ]);

    // 输出二维码到收银界面
    if (!empty($qr_response['qrImage'])) {
        echo '<div class="openpos-swish-qr" style="padding:15px; border:1px solid #eee; border-radius:8px; text-align:center; margin-top:20px;">';
        echo '<h4>扫描Swish二维码支付</h4>';
        echo '<img src="data:image/png;base64,' . esc_attr($qr_response['qrImage']) . '" alt="Swish支付码" style="width:180px; height:180px;"/>';
        echo '<p style="margin-top:10px;">金额: ' . wc_price($order_total) . '</p>';
        echo '</div>';
    }
}

关键注意事项

  • 支付方式Slug匹配:确保$order->get_payment_method()返回的值和你Swish网关注册的slug完全一致(比如注册网关时用register_payment_method('swish', ...),则slug为swish)
  • 金额单位转换:Swish API要求金额以最小货币单位提交,瑞典克朗需乘以100,若你的网关已处理此逻辑,可直接使用$order->get_total()
  • 二维码生成逻辑:如果你的Swish网关返回的是二维码URL而非base64图片,将<img>标签的src替换为对应的URL即可
  • 回调处理:确保callback_url指向你已实现的Swish回调接口,用于支付成功后更新订单状态(标记为已支付、完成等)

集成失败排查点

  1. 钩子参数验证:在回调函数开头添加var_dump($order); exit;,确认是否正确获取到OpenPOS订单对象
  2. Swish API调试:在网关调用后添加error_log(print_r($qr_response, true));,检查API返回是否正常,是否有错误信息
  3. 优先级冲突:调整钩子的优先级数值(比如改为20),避免被其他同钩子的函数覆盖输出
  4. 样式冲突:检查OpenPOS的前端CSS是否隐藏了自定义输出的内容,可通过浏览器开发者工具查看元素是否存在

内容的提问来源于stack exchange,提问作者Tom944

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:22:50