我正在尝试将用户信用卡存储到条带中。令牌生成后,我尝试将用户的令牌保存为Stripe作为客户。但我没有找到任何问题的答案,我只需要将卡存储到已经存在的用户。
我尝试使用方法Stripe.Customers.update,但它存储了新卡,删除了"默认"如果用户有一张卡片。并使用方法Stripe.Customers.create它使用新卡创建一个新客户,但我需要存储在特定用户。
Cloud Code:
Parse.Cloud.define("stripeCreateCard", function(request,response)
{
Stripe.initialize(STRIPE_SECRET_KEY);
Stripe.Customers.create
(
request.params,
{
success:function(results)
{
response.success(results);
},
error:function(error)
{
response.error("Error:" +error);
}
}
);
});
Parse.Cloud.define("stripeUpdateCustomer", function(request, response)
{
Stripe.initialize(STRIPE_SECRET_KEY);
Stripe.Customers.update
(
request.params["customerId"],
request.params["data"],
{
success:function(results)
{
console.log(results["id"]);
response.success(results);
},
error:function(error)
{
response.error("Error:" +error);
}
}
);
});
iOS代码:
class func getParamsForAddingCardToCustomer(custormerId: String, cardToken: String) -> NSDictionary {
let params = NSMutableDictionary()
params.setObject(["card" : cardToken], forKey: "data")
params.setObject(custormerId, forKey: "customerId")
return params
}
var params = ParamsHelper.getParamsForAddingCardToCustomer(stripeId, cardToken: token)
PFCloud.callFunctionInBackground("stripeCreateCard", withParameters: params as [NSObject : AnyObject]) {
(response: AnyObject?, error: NSError?) -> Void in
let responseString = response as? String
if (error === nil) {
println("Response: \(responseString) ")
}
else if (error != nil) {
println("Error: \(error) \(error!.userInfo)")
}
}
我已经尝试了几个参数来存储卡片,但我总是收到错误'收到未知参数'
任何人都有任何想法如何存储卡而不删除或创建新客户?
答案 0 :(得分:2)
Parse的条带实现并不尽可能完整。在许多情况下,您必须使用HTTPRequest来执行Parse不提供的条带函数。
对于这些情况,我使用以下iOS方法和CloudCode来执行我的所有条带HTTPRequests。在遵循条带CURL API文档时,可以非常轻松地进行编码。然后我构建了这个方法来执行大多数条带任务,IE创建/更新/删除客户,卡片,收费等。
我开始给它一个方法,即GET,POST,DELETE,具体取决于你是想要检索,创建/更新还是删除条纹对象。
然后我给它添加了一个可选的pre / suf / postfix组合来创建一个url。创建的示例网址:
最后我给它参数,在创建卡片并将其添加到客户的情况下,这只需要是包含tokenID的字典。
+(void)executeStripeCloudCodeWithMethod:(NSString *)method
prefix:(NSString *)prefix
suffix:(NSString *)suffix
postfix:(NSString *)postfix
secondPostfix:(NSString *)secondPostfix
parameters:(NSDictionary *)params
completionHandler:(ELStripeCompletionBlock)handler
{
NSDictionary *parameters = @{@"method":method,
@"prefix":prefix?prefix:@"",
@"suffix":suffix?suffix:@"",
@"postfix":postfix?postfix:@"",
@"secondPostfix":secondPostfix?secondPostfix:@"",
@"params":params?params:[NSNull null]
};
[PFCloud callFunctionInBackground:@"stripeHTTPRequest"
withParameters:parameters
block:^(id object, NSError *error) {
id jsonObject;
if (!error) {
NSError *jsonError = nil;
//Turn the json string into an NSDictionary
jsonObject = [NSJSONSerialization JSONObjectWithData:[object dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions error:&jsonError];
}
handler(jsonObject,error);
}];
}
执行的云代码:
var STRIPE_SECRET_KEY = 'sk_test_your_test_code_here';
var STRIPE_API_BASE_URL = 'api.stripe.com/v1/'
Parse.Cloud.define("stripeHTTPRequest", function(request, response)
{
//Check for valid pre/suf/postfixes, if they are not there do not include them.
var prefix = request.params["prefix"];
var suffix = "";
var postfix = "";
var secondPostfix = "";
if (!isEmpty(request.params["suffix"])) suffix = '/'+request.params['suffix'];
if (!isEmpty(request.params["postfix"])) postfix = '/'+request.params['postfix'];
if (!isEmpty(request.params["secondPostfix"])) secondPostfix = '/'+request.params['secondPostfix'];
Parse.Cloud.httpRequest(
{
method: request.params["method"],
//Create URL from base url and pre/suf/postfixes
url: 'https://'+STRIPE_API_BASE_URL + prefix + suffix + postfix + secondPostfix,
headers: {
'Authorization': "Bearer " + STRIPE_SECRET_KEY
},
params:request.params["params"],
success: function(httpResponse)
{
//response text is a json dictionary
response.success(httpResponse.text);
},
error: function(httpResponse)
{
response.error(httpResponse.text);
}
});
});
使用上面的方法,我可以创建单独的方法来执行我需要的大多数条带任务。
这是一个创建新卡并将其附加到客户的示例 Stripe Card creation API
+ (void)createCardFromToken:(NSString *)tokenId customerId:(NSString *)customerId completionHandler:(ELCardCompletionBlock)handler
{
[ELStripe executeStripeCloudCodeWithMethod:@"POST" //I use post here because we are creating a card. POST would also be used for updating a customer/card or refunding a charge for example
prefix:@"customers" //If you look at the documentation and the example URL I use "customers" here as the prefix
suffix:customerId //The customerID is the suffix, this will be the customer you are going to add the card to
postfix:@"cards" //I believe this is "sources" now
secondPostfix:nil //Not needed for this URL
parameters:@{
@"card":tokenId //Only parameter is a tokenId, and I wrap this inside an NSDictionary
}
completionHandler:^(id jsonObject, NSError *error) {
if (error)
{
//Handle the error code here
handler(nil,rejectError);
return;
}
//If no error stripe returns a dictionary containing the card information. You can use this information to create a card object if so desired.
handler([ELCard cardFromDictionary:jsonObject],error);
}];
}