java - 在多个项目上剥离 publishabe 密钥
问题描述
我刚开始使用条纹,我在这个问题上停留了一个星期,我已经获得了实时可发布密钥和密钥,在我添加卡详细信息后我得到错误: 请注意:密钥也用于我们的 IOS 项目之一,该 API 在 IOS 上运行良好,但在 android 上失败,我什至在邮递员上对其进行了测试,并添加了卡。我不确定我是否遗漏了代码中的某些内容,或者是服务器问题。非常感谢您的帮助!
<-- 500 Internal Server Error https://ABCD.com/api/user/card (988ms)
Date: Fri, 11 Dec 2020 08:57:31 GMT
D/OkHttp: Server: Apache
Cache-Control: no-cache, private
X-RateLimit-Limit: 60
D/OkHttp: X-RateLimit-Remaining: 59
D/OkHttp: Vary: Authorization
Connection: close
Transfer-Encoding: chunked
D/OkHttp: Content-Type: application/json
D/OkHttp: {"error":"Your card was declined."}
当我阅读条带文档时,它说 500 个错误来自条带服务器端。
这是调用和获取响应的活动:函数 addCardToAccount() 被编码为添加一张卡并将数据发送到服务器,即卡号和条带令牌,我获取正确的令牌和卡号,但它失败并且没有'不返回成功的响应。它进入 else 循环并返回“您的卡已被拒绝”
public class AddCardActivity extends AppCompatActivity {
String Card_Token = "";
String Card_Number="";
CustomDialog customDialog;
static final Pattern CODE_PATTERN = Pattern
.compile("([0-9]{0,4})|([0-9]{4}-)+|([0-9]{4}-[0-9]{0,4})+");
@BindView(R.id.card_form)
CardForm cardForm;
@BindView(R.id.addCard)
Button addCard;
@BindView(R.id.activity_add_card)
LinearLayout activityAddCard;
Context context;
Activity activity;
ApiInterface apiInterface = ApiClient.getRetrofit().create(ApiInterface.class);
@BindView(R.id.toolbar)
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setTheme(R.style.Mytheme);
setContentView(R.layout.activity_add_card);
ButterKnife.bind(this);
context = AddCardActivity.this;
activity = AddCardActivity.this;
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
cardForm.cardRequired(true)
.expirationRequired(true)
.cvvRequired(true)
.postalCodeRequired(false)
.mobileNumberRequired(false)
.actionLabel("Add CardDetails")
.setup(activity);
addCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
customDialog = new CustomDialog(context);
customDialog.setCancelable(false);
if (customDialog != null)
customDialog.show();
if (cardForm.getCardNumber() == null || cardForm.getExpirationMonth() == null || cardForm.getExpirationYear() == null || cardForm.getCvv() == null) {
if ((customDialog != null) && (customDialog.isShowing()))
customDialog.dismiss();
displayMessage(context.getResources().getString(R.string.enter_card_details));
} else {
if (cardForm.getCardNumber().equals("") || cardForm.getExpirationMonth().equals("") || cardForm.getExpirationYear().equals("") || cardForm.getCvv().equals("")) {
if ((customDialog != null) && (customDialog.isShowing()))
customDialog.dismiss();
displayMessage(context.getResources().getString(R.string.enter_card_details));
} else {
final String cardNumber = cardForm.getCardNumber();
int month = Integer.parseInt(cardForm.getExpirationMonth());
int year = Integer.parseInt(cardForm.getExpirationYear());
String cvv = cardForm.getCvv();
Utils.print("MyTest", "CardDetails Number: " + cardNumber +
"Month: " + month + " Year: " + year);
final Card card = new Card(cardNumber, month, year, cvv);
try {
Stripe stripe = new Stripe(AddCardActivity.this, BuildConfigure.STRIPE_PK);
stripe.createToken(
card,
new TokenCallback() {
public void onSuccess(Token token) {
// Send token to your server
Utils.print("CardToken:", " " + token.getId());
Log.e("Token", String.valueOf(token));
Log.e("TokenID",token.getId());
Utils.print("CardToken:", " " + token.getCard().getLast4());
Card_Token = token.getId();
Card_Number=card.getNumber();
Long card_number= Long.parseLong(Card_Number);
addCardToAccount(Card_Token,Card_Number);
}
public void onError(Exception error) {
// Show localized error message
displayMessage(context.getResources().getString(R.string.enter_card_details));
if ((customDialog != null) && (customDialog.isShowing()))
customDialog.dismiss();
}
}
);
} catch (Exception e) {
e.printStackTrace();
if ((customDialog != null) && (customDialog.isShowing()))
customDialog.dismiss();
}
}
}
}
});
}
public void addCardToAccount(final String cardToken, final String cardNumber) {
Log.e("stripe_token", cardToken);
Log.e("cardNumber", String.valueOf(cardNumber));
Call<Message> call = apiInterface.addCard(cardToken,cardNumber);
call.enqueue(new Callback<Message>() {
@Override
public void onResponse(@NonNull Call<Message> call, @NonNull Response<Message> response) {
customDialog.dismiss();
if (response.isSuccessful()) {
Toast.makeText(context, "" + response.body().getMessage(), Toast.LENGTH_SHORT).show();
finish();
} else {
try {
JSONObject jObjError = new JSONObject(response.errorBody().string());
Toast.makeText(context, jObjError.optString("error"), Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(@NonNull Call<Message> call, @NonNull Throwable t) {
Toast.makeText(AddCardActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
customDialog.dismiss();
Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
}
});
}
}
API是:
@FormUrlEncoded
@POST("api/user/card")
Call<Message> addCard(@Field("stripe_token") String stripeToken, @Field("number") String cardNumber );
解决方案
推荐阅读
- reactor - AutoService 无法注册 BlockHoundIntegration
- visual-studio-code - 如何在 vscode 中关闭无扩展名文件的自动检测
- google-bigquery - 访问被拒绝:BigQuery BigQuery:用户无权访问策略标签
- python - 使用在 Dataflow 上运行的 Beam 管道更新函数变量
- python - 如何确定是否在列中找到了一个单词,如果不是,我如何确保它显示在 Pandas 的数据框中
- html - ios设备问题上的highcharts
- python - 是否可以使用 Python XlsxWriter 将股票数据类型写入单元格?
- javascript - 将数组传递给 React 组件,然后在子组件中访问该数组中的值
- python-2.7 - 带有python 2.7的Windows路径中的德语变音符号
- c# - 将项目迁移到另一个 Repo 后,VS Code 智能不起作用