私の名前はIgorです。私はTrinity DigitalチームのAndroid開発者です。 今日は、クールなツールであるGoogle Pay APIについてお話したいと思います 。
したがって 、アプリケーションで購入でき、同時にアプリ内課金を使用していない場合(Google Playは処理の責任を負いません)、支払いオプションの中に「カード支払い」がある可能性があります。 これは、カードを使用して美しくデザインされた画面上、または支払いサービスプロバイダー(以降-支払い処理業者)のウェブサイトでカードデータを入力するようユーザーを送信する必要があるたびに意味します。 大切な注文の代金を支払うためにユーザーが実行しなければならないアクションの数をすでに計算しましたか? ええ、今ではたった2つのタパスで同じターゲットアクションを実行できると想像してください。 また、ユーザーにそのような機会を与えてみませんか? 成功の主な条件-販売者はGoogleに登録し 、支払い処理業者はGoogleと協力する必要があります。
Android Payに協力しているロシアの銀行のリスト:
AK Bars Bank
アルファ銀行
BINBANK
プロムスビアズバンク
VTB24
銀行の開設
MTS Bank
ライファイゼン銀行
ロケットバンク
ロシア農業銀行
ロシア標準銀行
ズベルバンク
ティンコフ銀行
ポイント
ヤンデックスマネー
ユーザーの表示方法: ユーザーはアプリケーションの支払いタイプ選択画面に移動し、「Pay via Google」ボタンをクリックするか、目的のカードを選択するか、デフォルトで指定されているカードを残すか、確認ボタンを押します。 できた!
Google Pay APIを使用すると、ユーザーはGoogleアカウントにリンクされたカードまたはGoogle Payに追加されたカードを選択できます。
次に、 統合に直接渡します。
手順を検討してください。
- レイアウト
- コード
- テスト中
- 手動提出
- 発売日
1.レイアウト
最初に言及する価値があるのは、 ガイドラインについて設計者に警告することです。 要点について簡単に説明します。
- 「Pay via Google」ボタンが配置される画面の前または画面で、購入価格を示す必要があります。
- ユーザーに注文データを変更する機会を与え、支払い方法を選択する[、住所を変更する];
- 支払いの詳細(数字、日付など)を完全に表示しないでください。
- もう一度-「Pay via Google」-これは、ロシア語をサポートするアプリケーションを作成している場合にボタンに表示されるべき正確な碑文です。
- Googleは標準のボタンを使用することをお勧めします。 独自のデザインで一般的に暗いテーマまたはボタンを使用する場合は、それらを記述する必要があります。 androidpay-api-support@google.comでサポートしています 。 しかし、カスタムボタンの上にも、Googleのロゴと碑文が必要です...はい、理解していただければ幸いです:);
- 幅に制限はありません。ボタンの最小の高さは40dpです。 背を高くしたり広くしたりする場合は、テキストを中央に揃えることを忘れないでください。
これらの項目を順守すると、すべてのチェックをすばやく通過してホワイトリストに登録できます。
2.コード
Googleを介した支払いを機能させるには、ユーザーの電話に11.4以上のバージョンのGoogle Play Servicesをインストールする必要があります。 しかし、心配する必要はありません。支払いが可能かどうか、またはボタンを非表示にするかどうかを通知する特別な方法があります。
まず、必要な依存関係をアプリケーションレベルのbuild.gradleに追加します。 実装の前に、バージョンの関連性を確認してください!
dependencies { compile 'com.google.android.gms:play-services-wallet:11.4.0' compile 'com.android.support:support-v4:24.1.1' compile 'com.android.support:appcompat-v7:24.1.1' }
次はAndroidManifestの更新です。
<application> ... <!-- Enables the Google Pay API --> <meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true" /> </application>
少しだけ残っています:
- アクティビティまたはフラグメントでPaymentsClientを作成します。 これらのクラスを煩雑にしないために、たとえば、すべてのコードをGooglePaymentUtilsメソッドに入れることができます。 次に:
class MainActivity : AppCompatActivity() { private lateinit var googlePaymentsClient: PaymentsClient ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... googlePaymentsClient = GooglePaymentUtils.createGoogleApiClientForPay(context) } ... }
object GooglePaymentUtils { fun createGoogleApiClientForPay(context: Context): PaymentsClient = Wallet.getPaymentsClient(context, Wallet.WalletOptions.Builder() .setEnvironment(WalletConstants.ENVIRONMENT_TEST) .setTheme(WalletConstants.THEME_LIGHT) .build()) }
定数に注意してください。
WalletConstants.ENVIRONMENT_TEST -Googleが戦闘環境へのアクセスを許可するまで、フロー支払いを個別にテストするためにそれを使用する必要があります。 Google Payダイアログにアプリケーションが認識されないという警告が表示されても心配しないでください。
WalletConstants.THEME_LIGHT-軽い話題の対話、暗い話題もあります。
- クライアントがいるので、支払いを使用してボタンを表示できるかどうかをリクエストする準備ができました。
object GooglePaymentUtils { fun checkIsReadyGooglePay(paymentsClient: PaymentsClient, callback: (res: Boolean) -> Unit) { val isReadyRequest = IsReadyToPayRequest.newBuilder() .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD) .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD) .build() val task = paymentsClient.isReadyToPay(isReadyRequest) task.addOnCompleteListener { try { if (it.getResult(ApiException::class.java)) // , callback.invoke(true) else // callback.invoke(false) } catch (e: ApiException) { e.printStackTrace() callback.invoke(false) } } } }
PAYMENT_METHOD_CARD 、 PAYMENT_METHOD_TOKENIZED_CARD-彼らは、ユーザーのGoogleアカウントのカードとAndroid Payに関連付けられたカードを見たいと言っています。
- ボタンを表示できる場合は、クリックハンドラーを配置する必要があります
btnPaymentByGoogle.setOnClickListener { val request = GooglePaymentUtils.createPaymentDataRequest(price) AutoResolveHelper.resolveTask<PaymentData>(googlePaymentsClient.loadPaymentData(request), context, REQUEST_CODE) }
ここで、価格は直線であることを忘れないでください。 そして最も重要なことは、フラグメントからAutoResolveHelper.resolveTaskを呼び出した場合でも、結果は引き続きアクティブになります(詳細は後で説明します)[この記事の執筆時点では、AutoResolveHelperは結果をフラグメントに返すことができません]。
fun createPaymentDataRequest(price: String): PaymentDataRequest { val transaction = createTransaction(price) val request = generatePaymentRequest(transaction) return request } fun createTransaction(price: String): TransactionInfo = TransactionInfo.newBuilder() .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL) .setTotalPrice(price) .setCurrencyCode(CURRENCY_CODE) .build() private fun generatePaymentRequest(transactionInfo: TransactionInfo): PaymentDataRequest { val tokenParams = PaymentMethodTokenizationParameters .newBuilder() .setPaymentMethodTokenizationType (WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_DIRECT) .addParameter("publicKey", TOKENIZATION_PUBLIC_KEY) build() return PaymentDataRequest.newBuilder() .setPhoneNumberRequired(false) .setEmailRequired(true) .setShippingAddressRequired(true) .setTransactionInfo(transactionInfo) .addAllowedPaymentMethods(SUPPORTED_METHODS) .setCardRequirements(CardRequirements.newBuilder() .addAllowedCardNetworks(SUPPORTED_NETWORKS) .setAllowPrepaidCards(true) .setBillingAddressRequired(true) .setBillingAddressFormat(WalletConstants.BILLING_ADDRESS_FORMAT_FULL) .build()) .setPaymentMethodTokenizationParameters(tokenParams) .setUiRequired(true) .build() }
ここで、 CURRENCY_CODE =“ RUB”。
WalletConstants.TOTAL_PRICE_STATUS_FINAL-購入価格は最終的なものであり、今後変更されることはありません。
オプションもあります:
WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED-コストは概算であり、たとえば住所を指定した後に変更される場合があります。
WalletConstants.TOTAL_PRICE_STATUS_NOT_CURRENTLY_KNOWN-いまだにその量はわかりません。
¯\ _(ツ)_ /¯をチェックしなかったため、実際に最後の2つの定数がどのように動作するかを言うことはできません。
PaymentMethodTokenizationParametersとそのsetPaymentMethodTokenizationTypeメソッドについて詳しく見てみましょう。
- PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY
支払いプロセッサがリストされている場合にのみ使用されます:
アディエン
Braintree
PaySafe
ストライプ
ヴァンティヴ
ワールドペイ
次に、.addParameter("publicKey", TOKENIZATION_PUBLIC_KEY)
代わりに
.addParameter("gateway", "yourGateway")
書く必要があります
.addParameter("gatewayMerchantId", "yourMerchantIdGivenFromYourGateway")
- それ以外の場合、上記のタイプPAYMENT_METHOD_TOKENIZATION_TYPE_DIRECTが使用されます。
これを行うには、支払いサービスプロバイダーから公開鍵を要求し、それを.addParameter("publicKey", TOKENIZATION_PUBLIC_KEY)
転送する必要があります
これで、リクエストを作成できます。
.setPhoneNumberRequired-ユーザーが番号を入力するかどうか。
.setEmailRequired-ユーザーがメールを入力する必要があるかどうか
.setShippingAddressRequired-ユーザーが国を選択する必要があるかどうか。 ここでは、このトランザクションが実行される国の数を制限できます。
.addAllowedPaymentMethods - WalletConstants.PAYMENT_METHOD_CARD -Googleアカウントのカード、 WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD -Google Payに追加されたカードがあります。
CardRequirementsでは、Visa、Mastercard、およびその他のシステムのカードが機能することを示します(たとえば、MIR)
val SUPPORTED_NETWORKS = arrayListOf(WalletConstants.CARD_NETWORK_OTHER, WalletConstants.CARD_NETWORK_VISA, WalletConstants.CARD_NETWORK_MASTERCARD)
- PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY
- それだけです。リクエストを作成し、クライアントを介して送信し、AutoResolveHelperを介して結果を待っています。
覚えているように、結果はアクティビティで発生します。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { LOAD_PAYMENT_DATA_REQUEST_CODE -> { when (resultCode) { Activity.RESULT_OK -> { if (data == null) return val paymentData = PaymentData.getFromIntent(data) } Activity.RESULT_CANCELED -> { // , // google pay // - , // } AutoResolveHelper.RESULT_ERROR -> { if (data == null) return // . // , // val status = AutoResolveHelper.getStatusFromIntent(data) Log.e("GOOGLE PAY", "Load payment data has failed with status: $status") } else -> { } } } else -> { } } }
それだけです。paymentDataには、サーバーに渡す必要のあるトークンがあります。 さらなるロジックは、支払いプロセッサに依存します。
3.テスト
複雑なことはありません。WalletConstants.ENVIRONMENT_TEST定数が設定されていることを確認し、フロー全体を調べてください。 お金はカードから引き落とされず、テストトークンが渡されますので、支払い処理者は支払いを拒否する必要があります。
4.手動検査のための送信
おめでとうございます! Googleに手動で確認するためにデバッグビルドを送信する準備ができました。
いくつかのヒント:
- アプリケーションがロシア語のみをサポートしている場合は、クリックする場所の説明を含むスクリーンショットを準備します。
- 注文プロセスに具体性がある場合は、詳細に説明してください。
- Google専用のテストアカウントを作成し、ビルドで直接送信します。
ビルドをandroidpay-api-support@google.comに送信し、応答を待ちます。
5.リリース
すべてが正常で、アプリケーションをリリースできると言われました。 まず、(販売者のアカウント(販売者)から) アドレスでアプリケーションをアクティブにするように求められます。
その後、PCIコンプライアンスの送信を求められる場合があります。 これらの文書は、支払いプロセッサがカードのセキュリティ基準に準拠していることを確認します。 彼に聞いて、サポートを送ってください。
これらの2つのポイントを完了すると、 WalletConstants.ENVIRONMENT_TESTをWalletConstants.ENVIRONMENT_PRODUCTIONに変更できることが通知されます 。 支払いプロセッサのテスト環境のキーを使用した場合は、TOKENIZATION_PUBLIC_KEYを変更する必要がある場合もあります。
以上で、実際の支払いをテストして、リリースを市場にリリースできます!
ありがとうと幸運を!