2016-06-28 1 views
0

J'ai eu beaucoup de difficultés avec cela, je ne peux pas voir où je vais mal. Bien que je suis assez novice, je suis en train de faire quelque chose une tonne de développeurs d'applications doivent réussir régulièrement à faire - processus une charge d'Apple payer par l'exemple de Stripe back-end Sinatra/Ruby disponible à:Intégration iOS avec le backend Heroku

https://github.com/stripe/example-ios-backend

Je crois que je J'ai tout fait très bien:

Mon compte Stripe est mis en place, je suis en mode test, j'ai vérifié ma banque, tout a l'air bien. J'utilise des clés d'API de test, secrètes et publiables: le code suivant est dans mon fichier web.ry légèrement modifié: vous pouvez voir que l'application fonctionne au moins à l'extrémité '/' si vous allez à: https://ibidurubypay.herokuapp.com - S'il vous plaît noter que je n'ai absolument aucune idée de ce que je fais dans Rails - les seuls mods que j'ai fait sont:

J'ai inséré la clé de test Stripe J'ai légèrement modifié le message de retour initial pour vérifier les changements sont mis à jour sur Heroku J'ai changé la monnaie en GBP (le compte de bande est GBP)

Le code est:

require 'sinatra' 
require 'stripe' 
require 'dotenv' 
require 'json' 

Dotenv.load 

Stripe.api_key = ENV['sk_test_mystripetestkeymystripetestkey'] 

get '/' do 
    status 200 
    return "Great, terrific, your backend is set up. Now you can configure the Stripe example iOS apps to point here." 
end 

post '/charge' do 

    # Get the credit card details submitted by the form 
    source = params[:source] || params[:stripe_token] || params[:stripeToken] 
    customer = params[:customer] 

    # Create the charge on Stripe's servers - this will charge the user's card 
    begin 
     charge = Stripe::Charge.create(
             :amount => params[:amount], # this number should be in cents 
             :currency => "gbp", 
             :customer => customer, 
             :source => source, 
             :description => "Example Charge" 
             ) 
             rescue Stripe::StripeError => e 
             status 402 
             return "Error creating charge: #{e.message}" 
    end 

    status 200 
    return "Charge successfully created" 

end 

get '/customers/:customer/cards' do 

    customer = params[:customer] 

    begin 
     # Retrieves the customer's cards 
     customer = Stripe::Customer.retrieve(customer) 
     rescue Stripe::StripeError => e 
     status 402 
     return "Error retrieving cards: #{e.message}" 
    end 

    status 200 
    content_type :json 
    cards = customer.sources.all(:object => "card") 
    selected_card = cards.find {|c| c.id == customer.default_source} 
    return { :cards => cards.data, selected_card: selected_card }.to_json 

end 

post '/customers/:customer/sources' do 

    source = params[:source] 
    customer = params[:customer] 

    # Adds the token to the customer's sources 
    begin 
     customer = Stripe::Customer.retrieve(customer) 
     customer.sources.create({:source => source}) 
     rescue Stripe::StripeError => e 
     status 402 
     return "Error adding token to customer: #{e.message}" 
    end 

    status 200 
    return "Successfully added source." 

end 

post '/customers/:customer/select_source' do 

    source = params[:source] 
    customer = params[:customer] 

    # Sets the customer's default source 
    begin 
     customer = Stripe::Customer.retrieve(customer) 
     customer.default_source = source 
     customer.save 
     rescue Stripe::StripeError => e 
     status 402 
     return "Error selecting default source: #{e.message}" 
    end 

    status 200 
    return "Successfully selected default source." 

end 

delete '/customers/:customer/cards/:card' do 

    card = params[:card] 
    customer = params[:customer] 

    # Deletes the source from the customer 
    begin 
     customer = Stripe::Customer.retrieve(customer) 
     customer.sources.retrieve(card).delete() 
     rescue Stripe::StripeError => e 
     status 402 
     return "Error deleting card" 
    end 

    status 200 
    return "Successfully deleted card." 

end 

Comme vous pouvez le voir l'application Web Ruby fonctionne très bien ...

Le passage à Xcode, je puis aller et télécharger l'exemple de Stripe Apps: https://github.com/stripe/stripe-ios/tree/master/Example

J'ouvre 'Stripe.xcworkspace' dans le Le dossier 'stripe-ios-master'.

Dans mon compte Apple Developer, je vais mettre en place une nouvelle application Merchant 'com.AH.thenameigaveit'

I tic tac ApplePay puis mis en place un identificateur de marchand avec: merchant.com.AH.thenameigaveit

Je vais à Stripe et crée un certificat CSR que je relie ensuite avec mon identifiant de marchand dans Apple Dev.

J'ai récupéré mon nouveau fichier CER Apple et l'ai téléchargé sur Stripe - et j'ai pu vérifier qu'il était installé avec succès.

Retour dans Xcode J'ai cliqué sur Fix Issue pour un problème de profil de provisionnement et tout est accepté.

Mes droits fichier dit « paiements-app-com.apple.developer.in »

Maintenant dans Xcode je vais à ViewController.swift dans l'exemple « simple » de rayure et de changer les valeurs des différentes variables utilisateur comme suit:

stripePublishableKey = « 'pk_test_mystripetestkeymystripetestkey' » mon test publiable clé

backendChargeURLString = « https://ibidurubypay.herokuapp.com »

appleMerchantId = « merchant.com Remarque: l'exemple Stripe 'Simple' Le code Swift fait référence à la devise comme USD alors que mon site Web.ry script fait référence à "gbp", mais d'après ce que je peux dire dans le passé quand je l'ai essayé plusieurs fois, cela semble peu important car la valeur de la devise n'est pas transmise au script Ruby (et mon compte Stripe est en GBP.)

Ainsi, le temps de construire et de faire fonctionner un iPhone 6 plus avec Apple Pay activé sur avec un live carte de crédit Visa ... app construit avec succès la première fois ..

première Autour de cela dit: "Demande de paiement est invalide: vérifiez vos droits", donc je vais à Capabilities et assurez-vous que le bon identifiant du marchand est vérifié contre ApplePay - construire encore et cette fois nous allons plus loin - l'écran Apple Pay se place parfaitement sur le écran, en spécifiant la carte de crédit liée Apple Pay à payer 10 $ pour la chemise fraîche .. - Je fais le uch, il arrive avec 'Processing Payment' puis peu de temps après 'Payment Not Completed!' et la boîte de dialogue Apple Pay recule à l'écran en reprenant l'option 'Acheter une chemise'

Donc, je ne sais absolument rien sur la communication avec ce backend serveur, sauf pour essayer de glaner quelques informations en revenant de l'appel, donc j'insérer:

print ("data: \(data), \r\r response: \(response), \r\r error: \(error)") 

qui me donne:

data: Optional(),

response: Optional({ URL: *(ASBEFORE)*ibidurubypay.herokuapp.com/charge } { status code: 402, headers { Connection = "keep-alive"; "Content-Length" = 248; "Content-Type" = "text/html;charset=utf-8"; Date = "Tue, 28 Jun 2016 00:16:43 GMT"; Server = "WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08)"; Via = "1.1 vegur"; "X-Content-Type-Options" = nosniff; "X-Frame-Options" = SAMEORIGIN; "X-Xss-Protection" = "1; mode=block"; } }),

error: nil

qui semble être un message de refus de carte, mais il n'y a rien de mal avec la carte.

Sur mon compte Stripe au portail, a été créé avec succès un jeton au moment: 2016/06/28 01:16:42

... Cependant, il n'y a aucune preuve de la 402 baisse je peux voir partout ici, peut-être que je ne cherche pas au bon endroit ...

Je serais vraiment reconnaissant si quelqu'un pouvait me faire savoir ce qui ne va pas - je me suis arraché les cheveux, j'ai été perplexe sur cela pendant des jours.

+1

Puisque vous êtes nouveau sur Ruby, je vous recommande de lire un peu à propos de 'byebug' et de l'utiliser pour faire du débogage. Vous pouvez placer un point d'arrêt dans votre action de contrôleur et vous assurer que les paramètres corrects sont envoyés à partir du client. Assurez-vous également de tester votre appel 'Stripe :: Charge.create' dans' irb' avant d'essayer de le connecter au serveur frontal. Il permet de tester des morceaux de code isolément pour identifier le véritable coupable des erreurs. –

Répondre

0

ok, donc je l'avais demandé aux gars de Stripe cette question et me faire sauter sur ils ont résolu d'emblée - la question était:

Stripe.api_key = ENV [ 'sk_test_mystripetestkeymystripetestkey'] dans mon script Ruby .. .

sOIT: il devrait être:

Stripe.api_key = 'sk_test_mystripetestkeymystripetestkey' (note n ° ENV [])

OU: MIEUX: si devrait être comme il a été téléchargé à partir Stripe, un environnement variable , Que je puis mis en place rayé, donc dans le script:

Stripe.api_key = ENV [ 'STRIPE_TEST_SECRET_KEY']

puis mettre à jour votre configuration Heroku pour créer une variable d'environnement nommée STRIPE_TEST_SECRET_KEY avec votre clé API de test la valeur: https://devcenter.heroku.com/articles/config-vars

Facile comme tarte une fois que vous savez comment, merci Stripe pour un grand soutien!