Android中RazorPay支付成功后Firebase用户count字段更新失败
看起来你遇到了支付成功后Firebase数据库count字段不更新的问题,我帮你梳理下代码里的几个关键问题,以及对应的修复方案:
1. 数据库引用指向错误
你的Firebase数据库结构是Userdata节点下包含各个用户,但代码里初始化数据库引用时写的是:
db = FirebaseDatabase.getInstance().getReference().child("db");
这里应该指向Userdata才对,否则后续更新的路径根本不存在,自然不会有任何数据变化。
2. 获取用户count的逻辑错误
在onDataChange里,你遍历子节点但每次都用dataSnapshot.getValue(users.class)(这是取整个父节点的数据),而不是当前遍历的ds1;而且局部变量u覆盖了外部的变量,导致d(存储count值的变量)没有正确获取到。另外,如果只需要获取一次数据,用addListenerForSingleValueEvent比实时监听更合适,避免不必要的资源消耗。
3. onPaymentSuccess里的count更新逻辑严重错误
da初始是null,da = da + pa;会得到类似null100的无效字符串,转Integer的时候肯定抛出异常,导致后续的数据库更新代码根本执行不到。- 变量名混淆:
startPayment里把输入值赋值给pa,但类变量是payamount,逻辑混乱,应该统一变量名增强可读性。 - 没有用之前获取到的原count值去累加,而是错误地处理字符串拼接。
- 没有判断
FirebaseUser是否为空,可能导致空指针异常。
修复后的完整代码
public class Payment extends AppCompatActivity implements PaymentResultListener { EditText value; Button pay; int payAmount; // 统一变量名,更清晰 FirebaseDatabase database; DatabaseReference dbRef; int currentCount; // 存储当前用户的count值 String currentUserId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_payment); value = findViewById(R.id.input); pay = findViewById(R.id.razorpay); // 初始化数据库引用,指向Userdata节点 dbRef = FirebaseDatabase.getInstance().getReference().child("Userdata"); // 获取当前登录用户ID FirebaseAuth mAuth = FirebaseAuth.getInstance(); FirebaseUser currentUser = mAuth.getCurrentUser(); if (currentUser != null) { currentUserId = currentUser.getUid(); // 一次性获取当前用户的count值 dbRef.child(currentUserId).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { Users user = dataSnapshot.getValue(Users.class); if (user != null) { currentCount = user.getCount(); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Toast.makeText(Payment.this, "获取用户数据失败: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } }); } else { Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show(); pay.setEnabled(false); // 未登录则禁用支付按钮 } pay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startPayment(); } }); } private void startPayment() { try { payAmount = Integer.parseInt(value.getText().toString().trim()); if (payAmount <= 0) { Toast.makeText(this, "请输入有效的支付金额", Toast.LENGTH_SHORT).show(); return; } } catch (NumberFormatException e) { Toast.makeText(this, "请输入正确的数字金额", Toast.LENGTH_SHORT).show(); return; } Checkout checkout = new Checkout(); final Activity activity = this; try { JSONObject options = new JSONObject(); options.put("amount", payAmount * 100); // RazorPay的金额单位是派萨,所以乘以100 // 可以添加其他必要参数,比如商户名称、描述等 options.put("name", "你的商户名称"); options.put("description", "支付测试"); options.put("currency", "INR"); checkout.open(activity, options); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(this, "支付初始化失败", Toast.LENGTH_SHORT).show(); } } @Override public void onPaymentSuccess(String paymentId) { try { Toast.makeText(Payment.this, "支付成功,订单ID: " + paymentId, Toast.LENGTH_SHORT).show(); // 计算新的count值:原count + 支付金额(如果你的业务逻辑是count累加支付金额,可根据需求调整) int newCount = currentCount + payAmount; // 更新当前用户的count字段,添加成功/失败监听便于排查问题 if (currentUserId != null) { dbRef.child(currentUserId).child("count").setValue(newCount) .addOnSuccessListener(aVoid -> Toast.makeText(Payment.this, "count更新成功", Toast.LENGTH_SHORT).show()) .addOnFailureListener(e -> Toast.makeText(Payment.this, "count更新失败: " + e.getMessage(), Toast.LENGTH_SHORT).show()); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "处理支付结果失败", Toast.LENGTH_SHORT).show(); } } @Override public void onPaymentError(int errorCode, String errorMessage) { Toast.makeText(Payment.this, "支付失败: " + errorMessage, Toast.LENGTH_SHORT).show(); } // 注意:实体类字段名要和数据库完全一致,且必须有无参构造函数 public static class Users { private String name; private int age; private int count; public Users() {} public Users(String name, int age, int count) { this.name = name; this.age = age; this.count = count; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } } }
额外注意事项
- 确保你的Firebase数据库规则允许当前用户更新自己的节点,比如可以设置规则:
{ "rules": { "Userdata": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } } - 检查RazorPay的初始化是否正确(比如在Manifest里配置API密钥),确保支付流程能正常触发
onPaymentSuccess。 - 实体类
Users的字段名必须和数据库里的完全一致,并且要有无参构造函数,否则Firebase无法正确解析数据。
内容的提问来源于stack exchange,提问作者mysticwarlord
相关产品推荐
相关产品推荐

