从信用卡生成令牌 Stripe.Net

Generate token from credit card Stripe.Net

由于Stripe.Net在PCL端不再起作用,我们需要使用DependencyServices<>。但是,当我尝试从信用卡信息生成令牌时,似乎...它在文档中丢失,我在网络或文档中找不到任何内容,这正常吗?

我想实现这样的目标:

public string CardToToken()
{
    var card = new Card()
    {
        Number = "4242424242424242",
        ExpiryMonth = 12,
        ExpiryYear = 16,
        CVC = 123
    };

    try
    {
        token = await Stripe.CreateToken(card);
    }
    catch (Exception ex)
    { 
        return null;
    }

    return token;
}

那么我就可以简单地将它发送到我的服务器。有什么想法可以轻松实现吗?这是我需要为我的项目完成的最后一点...

这个例子在我Android这边。

感谢您的帮助...

我找到了一个很好的解决方法(目前只有 Android,但我会尽快更新 UWP 的答案)。


步骤 1

  • 首先,您必须在每个子平台上安装 Stripe.Net,我的意思是 Android、iOS、UWP、不是 PCL 部分(您共享的代码)。

步骤 2

  • 要让它工作,您需要 3 个 classes、一个模型、一个接口和另一个 class 在您的子平台中继承自该接口。

你将得到的信息应该存储在那个class中,我喜欢这样,当然你可以通过其他方式实现。

在你的 PCL 中声明一个 CreditCard.cs:

public class CreditCard
{
    public string Numbers { get; set; }
    public string HolderName { get; set; }
    public string Month { get; set; }
    public string Year { get; set; }
    public string Cvc { get; set; }

    /// <summary>
    /// Initializes a new instance of the CreditCard class.
    /// </summary>
    public CreditCard()
    {
        Numbers = "";
        Month = "";
        Year = "";
        Cvc = "";
        HolderName = "";
    }

    /// <summary>
    /// Verifies the credit card info. 
    /// However, if the data provided aren't matching an existing card, 
    /// it will still return `true` since that function only checks the basic template of a credit card data.
    /// </summary>
    /// <returns>True if the card data match the basic card information. False otherwise</returns>
    public bool VerifyCreditCardInfo()
    {
        if (Numbers == ""
            || Month == ""
            || Year == ""
            || Cvc == ""
            || HolderName == "")
            return false;
        try
        {
            int month = 0;
            int year = 0;
            int cvc = 0;

            if (!Int32.TryParse(Month, out month)
                || !Int32.TryParse(Year, out year)
                || !Int32.TryParse(Year, out cvc))
                return false;

            if (month < 1 || month > 12)
                return false;
            else if (year < 1990 || year > new DateTime().Year)
                return false;
            else if (Cvc.Length != 3)
                return false;
        }
        catch (Exception) { return false; }

        return true;
    }
}

步骤 3

  • 现在您已将数据存储在 class 中,现在是从中生成 Stripe 令牌的时候了!为此,我们将使用 DependencyServices<>。所以我们在共享代码(PCL)中需要一个接口IStripeServices,在子平台中需要一个继承它的服务。

在你的 PCL 中声明一个 IStripeServices

public interface IStripeServices
{
    string CardToToken(CreditCard creditCard);
}

Android:创建一个 StripeServices class 像这样:

public class StripeServices : IStripeServices
{
    public string CardToToken(CreditCard creditCard)
    {
        var stripeTokenCreateOptions = new StripeTokenCreateOptions
        {
            Card = new StripeCreditCardOptions
            {
                Number = creditCard.Numbers,
                ExpirationMonth = Int32.Parse(creditCard.Month),
                ExpirationYear = Int32.Parse(creditCard.Year),
                Cvc = creditCard.Cvc,
                Name = creditCard.HolderName
            }
        };

        var tokenService = new StripeTokenService();
        var stripeToken = tokenService.Create(stripeTokenCreateOptions);

        return stripeToken.Id;
    }
}

步骤 4

您现在只需在您的共享代码中使用这段代码就可以从您的信用卡生成一个 Stripe 令牌 (PCL)

if (CreditCardData.VerifyCreditCardInfo())
    string cardToken = DependencyService.Get<IStripeServices>().CardToToken(CreditCardData);
else
    Debug.WriteLine("The information are either missing or wrong.");

我希望这个答案能有所帮助,我会尝试尽快在 public github 存储库上为想要测试它的人创建一个解决方案