欢迎大家!
我目前正在努力将Stripes API生成的令牌从Android应用程序传递到ParseServer。以下是我的代码,请注意,我评论过以前未能通过尝试让您知道我尝试过的内容并激发您的想象力。请注意,通过反复试验,问题在于将数据保存到服务器。我已经仔细检查过类User是否具有写权限,并且它有一个标题为token的Object属性。
// Test the data.
if (userCard.validateCard()) {
Stripe stripe = new Stripe(CardActivity.this, "correct data is here I removed it, for StackOverflow");
stripe.createToken(
userCard,
new TokenCallback() {
public void onSuccess(final Token token) {
// Send token to your server
// Query the users, and get the username.
ParseQuery<ParseObject> query = ParseQuery.getQuery("User");
ParseUser user = ParseUser.getCurrentUser();
String objectId = user.getObjectId();
// Query the current user.
//query.whereEqualTo("objectId", username);
ParseObject object;
try {
object = query.get(objectId);
object.put("token", token);
object.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Toast.makeText(CardActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
}
});
} catch (ParseException e) {
Toast.makeText(CardActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
// Attempt to update... Currently not working.
/*query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e == null && objects != null) {
for (ParseObject object : objects) {
object.put("token", token);
object.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Toast.makeText(CardActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
}
});
}
} else {
Toast.makeText(CardActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});*/
}
public void onError(Exception error) {
// Show error message
Toast.makeText(CardActivity.this,
error.getMessage(),
Toast.LENGTH_LONG
).show();
}
}
);
} else {
Toast.makeText(CardActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:0)
这里有一些事情:
1)Parse允许您从“shell”向对象添加/覆盖信息。这是一个ParseObject实例,设置为指定的类,分配了一个objectId,然后是您要添加/更改的任何值,然后保存。您未分配值的任何字段都将被忽略,因此假设您只设置了field3,则field2和field1将不会被覆盖为空。
2)ParseUser user = ParseUser.getCurrentUser()
已经返回一个用户对象。您甚至不需要从id创建shell,这是一个功能完备的解析对象。然后,您可以设置所需的值并保存!
3)查询和提取(以及云函数调用)是异步的。这意味着代码会在后台线程上执行,主线程将继续执行。因此,需要在完成处理程序中调用需要这些方法结果的内容。你正在做object = query.get(objectId)
,但是query.get()需要运行一些,所以你可能在对象具有适当的值之前运行代码块的其余部分。
4)据我所知(不是Android开发人员,但我使用过JS和iOS SDK)Parse SDK对User类有一个特定的查询,比创建ParseQuery集更容易,更安全到“用户”类。应该是ParseUser.query()
所以,不是Android开发人员,我认为你想要的更像是这样:
// Test the data.
if (userCard.validateCard()) {
Stripe stripe = new Stripe(CardActivity.this, "correct data is here I removed it, for StackOverflow");
stripe.createToken(
userCard,
new TokenCallback() {
public void onSuccess(final Token token) {
// Send token to your server
// Query the users, and get the username.
ParseQuery<ParseObject> query = ParseQuery.getQuery("User");
ParseUser user = ParseUser.getCurrentUser();
try {
user.put("token", token);
user.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Toast.makeText(CardActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
}
});
} catch (ParseException e) {
Toast.makeText(CardActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
public void onError(Exception error) {
// Show error message
Toast.makeText(CardActivity.this,
error.getMessage(),
Toast.LENGTH_LONG
).show();
}
}
);
} else {
Toast.makeText(CardActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
}