问题描述
我正在使用Stripe开发信用卡付款。 在创建令牌(我已经完成)后,我不知道如何继续。
官方文件说:
使用令牌
然而,使用支付令牌获取它需要使用您的秘密API密钥从您的服务器进行API调用。 (出于安全考虑,切勿在应用程序中嵌入秘密API密钥。)在服务器上设置可以接收令牌的HTTP POST调用的端点。 在onActivityResult方法(用于Android Pay)或onSuccess回调(使用自己的表单时)中,您需要将提供的令牌POST到您的服务器。 确保与服务器的任何通信都是SSL安全的,以防止窃听。 查看完整的示例应用程序,查看所有内容。
我的代码是:
public class FragmentThree extends Fragment { private static final String TAG = "FragmentThree"; //Stripe private Card card; private TextView mResponse; private Button mPaymentBtn; private ProgressBar mProgressBar; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_three, container, false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setRetainInstance(true); mResponse = (TextView) getActivity().findViewById(R.id.response); mPaymentBtn = (Button) getActivity().findViewById(R.id.paymentBtn); mProgressBar = (ProgressBar)getActivity().findViewById(R.id.progressBar); mPaymentBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mProgressBar.setVisibility(View.VISIBLE); if(isNetworkAvailable()){ String cardNumber = "4242-4242-4242-4242"; int cardExpMonth = 12; int cardExpYear = 2018; String cardCVC = "123"; card = new Card( //We create a new Card cardNumber, cardExpMonth, cardExpYear, cardCVC ); if (!card.validateCard()){ //The card is not a valid one mProgressBar.setVisibility(View.GONE); Toast.makeText(getActivity(), R.string.Not_Valid_Card, Toast.LENGTH_SHORT).show(); }else{ Stripe stripe = null; try { //TODO Change with LIVE KEY stripe = new Stripe("pk_test_wt0efdvgYxds7CywHYKCqnhX"); } catch (AuthenticationException e) { mProgressBar.setVisibility(View.GONE); Toast.makeText(getActivity(), R.string.Merchant_Does_Not_Exist, Toast.LENGTH_SHORT).show(); } if(stripe != null){ stripe.createToken( card, new TokenCallback() { public void onSuccess(Token token) { // Send token to your server Log.d(TAG, "The token number is: " + token.getId()); mProgressBar.setVisibility(View.GONE); } public void onError(Exception error) { // Show localized error message Toast.makeText(getActivity(), error.getLocalizedMessage(), Toast.LENGTH_LONG).show(); mProgressBar.setVisibility(View.GONE); } } ); } } }else{ mProgressBar.setVisibility(View.GONE); Toast.makeText(getActivity(), R.string.No_Internet_Connection, Toast.LENGTH_SHORT).show(); } } }); } private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } }
如何让服务器(我不拥有)了解我的令牌? 那之后该怎么办? 如何从服务器或Firebase进行API调用? 我可以使用Firebase:我必须使用它吗? 我需要在那里实施什么?
对我来说,服务器端代表了一个问题。
有人可以给我写一步一步的实现,以便我知道如何处理令牌以及我接下来可以做什么?
以及如何确定SSL安全性?
对不起我的问题,但我从来没有这样做过。
谢谢你,加埃塔诺
1楼
您需要将该令牌发送到onActivityResult
函数中的服务器: : onActivityResult
您肯定需要服务器端应用程序 - 或第三方集成 - 来创建费用; 据我所知,你不能用Firebase做到这一点。
2楼
你需要一个中间服务器。 我用node.js用$ 7 / mo完成了与Heroku的Stripe集成
3楼
您不能在客户端进行条带api付款。 您需要使用方法创建服务以处理条带付款。 然后将您从令牌创建中获得的令牌传递给该服务。
你的客户端代码 -
stripe.createToken(
card,
new TokenCallback() {
public void onSuccess(Token token) {
// Send token to your server
示例(节点js服务方法): -
// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
var stripe = require("stripe")("your private key");
// Token is created using Stripe.js or Checkout!
// Get the payment token submitted by the form:
var token = request.body.stripeToken; // Using Express
// Charge the user's card:
var charge = stripe.charges.create({
amount: 1000,
currency: "usd",
description: "Example charge",
source: token,
}, function(err, charge) {
// asynchronously called
});