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

无PHP服务器时,如何在Firebase服务器为安卓应用生成Paytm校验和?

当然可以!你完全可以借助Firebase的Cloud Functions来搞定Paytm校验和的生成——这刚好能替代你没有的PHP服务器环境,完美适配安卓应用的支付接入需求。下面是详细的实现步骤和代码示例:

实现步骤与代码示例

1. 前期准备

  • 确保你已经拥有一个Firebase项目,并且本地安装了Firebase CLI(如果没有,先完成Firebase项目创建,再通过npm install -g firebase-tools安装CLI并登录账号)。
  • 从Paytm商家后台获取你的商户ID(MID)和商户密钥(Merchant Key),这两个是生成校验和的核心凭证。

2. 初始化Firebase云函数项目

在本地创建一个文件夹,打开终端执行以下命令:

firebase init functions

按照提示选择你的Firebase项目,选择JavaScript作为开发语言,自动安装依赖即可。

3. 安装Paytm Node.js SDK

进入functions目录,安装Paytm官方提供的Node.js SDK:

cd functions
npm install paytm-nodejs-sdk

4. 编写云函数代码

打开functions/index.js,替换成以下代码:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(); // 初始化Firebase Admin,用于后续操作数据库(可选)
const Paytm = require('paytm-nodejs-sdk');

// 从Firebase环境变量读取Paytm配置,绝对不要硬编码密钥!
const paytmConfig = {
  mid: functions.config().paytm.mid,
  key: functions.config().paytm.key,
  website: "DEFAULT", // 根据你的Paytm商户配置调整,一般用DEFAULT即可
  industryType: "Retail", // 按你的业务类型选择,比如Retail、Food等
  channelId: "APP" // 安卓应用固定填APP,网页端填WAP
};

const paytm = new Paytm(paytmConfig);

// 生成Paytm校验和的HTTP云函数
exports.generatePaytmChecksum = functions.https.onRequest(async (req, res) => {
  // 允许安卓端跨域请求
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Methods', 'POST');
  res.set('Access-Control-Allow-Headers', 'Content-Type');

  // 处理OPTIONS预检请求
  if (req.method === 'OPTIONS') {
    res.status(204).send('');
    return;
  }

  try {
    // 接收安卓端传来的订单核心参数(可根据需求添加更多参数)
    const { orderId, amount, customerId, customerEmail, customerPhone } = req.body;

    // 构建Paytm要求的支付参数
    const paymentPayload = {
      orderId: orderId,
      amount: amount,
      customerId: customerId,
      customerEmail: customerEmail,
      customerPhone: customerPhone,
      callbackUrl: `https://${process.env.GCLOUD_PROJECT}.cloudfunctions.net/paytmCallback` // 支付结果回调地址
    };

    // 调用SDK生成校验和
    const checksum = await paytm.generateChecksum(paymentPayload);

    // 返回给安卓端的完整支付参数
    res.status(200).json({
      success: true,
      mid: paytmConfig.mid,
      orderId: orderId,
      amount: amount,
      checksum: checksum,
      // 测试环境网关地址,生产环境换成https://securegw.paytm.in/theia/api/v1/initiateTransaction
      paymentGatewayUrl: `https://securegw-stage.paytm.in/theia/api/v1/initiateTransaction?mid=${paytmConfig.mid}&orderId=${orderId}`
    });
  } catch (error) {
    functions.logger.error("生成校验和失败:", error);
    res.status(500).json({
      success: false,
      message: "生成支付校验和失败,请稍后重试"
    });
  }
});

// Paytm支付结果回调云函数(用于验证支付结果并更新订单状态)
exports.paytmCallback = functions.https.onRequest(async (req, res) => {
  try {
    // 获取Paytm返回的所有回调参数
    const callbackData = req.body;

    // 验证Paytm返回的校验和,确保数据未被篡改
    const isChecksumValid = await paytm.verifyChecksum(callbackData);

    if (isChecksumValid) {
      // 校验和验证通过,处理支付结果
      const orderStatus = callbackData.STATUS;
      const orderId = callbackData.ORDERID;
      functions.logger.info(`订单 ${orderId} 支付状态: ${orderStatus}`);

      // 这里可以添加你的业务逻辑,比如更新Firestore中的订单状态
      // await admin.firestore().collection('orders').doc(orderId).update({
      //   status: orderStatus,
      //   paytmResponse: callbackData,
      //   updatedAt: admin.firestore.FieldValue.serverTimestamp()
      // });

      // 必须返回Paytm要求的响应格式,告知Paytm我们已成功接收回调
      res.status(200).send(JSON.stringify({ STATUS: "SUCCESS" }));
    } else {
      functions.logger.error(`订单 ${callbackData.ORDERID} 校验和验证失败`);
      res.status(400).send(JSON.stringify({ STATUS: "FAILURE" }));
    }
  } catch (error) {
    functions.logger.error("处理Paytm回调失败:", error);
    res.status(500).send(JSON.stringify({ STATUS: "FAILURE" }));
  }
});

5. 配置Firebase环境变量

为了避免密钥泄露,我们把Paytm的MID和密钥存储在Firebase的环境变量中,在终端执行:

firebase functions:config:set paytm.mid="你的商户ID" paytm.key="你的商户密钥"

6. 部署云函数

执行以下命令将云函数部署到Firebase服务器:

firebase deploy --only functions

部署完成后,你会得到两个云函数的URL,比如:

  • 生成校验和的URL:https://your-project-id.cloudfunctions.net/generatePaytmChecksum
  • 回调URL:https://your-project-id.cloudfunctions.net/paytmCallback

7. 安卓端对接

在安卓应用中,通过HTTP POST请求调用生成校验和的云函数,传递订单号、金额、用户信息等参数,拿到返回的校验和与支付参数后,调用Paytm的安卓SDK发起支付即可。

注意事项

  • 区分测试环境和生产环境:Paytm的测试网关是securegw-stage.paytm.in,生产环境是securegw.paytm.in,代码中要对应调整。
  • 订单号必须唯一:每个订单的orderId不能重复,否则会导致支付失败。
  • 回调逻辑必须可靠:支付结果以Paytm回调为准,客户端的支付结果只能作为参考,最终订单状态要以云函数中处理的回调结果更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:46