Skip to content

Commit

Permalink
sync with latest source
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasbark committed Mar 25, 2021
1 parent 018e417 commit ffa7c25
Show file tree
Hide file tree
Showing 12 changed files with 510 additions and 327 deletions.
7 changes: 6 additions & 1 deletion stripe_android/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ rootProject.allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}

Expand All @@ -37,5 +38,9 @@ android {

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.stripe:stripe-android:16.1.1'
implementation 'com.github.stripe:stripe-android:96fd89ead5'

implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,4 @@

public interface ActivityEventListener {
public void onActivityResult(Activity a, int requestCode, int resultCode, Intent data);

public void onActivityResult(int requestCode, int resultCode, Intent data);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
package com.facebook.react.bridge;

public abstract class BaseActivityEventListener implements ActivityEventListener {
import android.content.Intent;

import io.flutter.plugin.common.PluginRegistry;

public abstract class BaseActivityEventListener implements ActivityEventListener, PluginRegistry.ActivityResultListener {
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
onActivityResult(null, requestCode, resultCode, data);
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ protected void removeActivityEventListener(ActivityEventListener listener) {
eventListeners.remove(listener);
}

public String getName() {
return "StripeSdk";
}

@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
for (ActivityEventListener eventListener : eventListeners) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,7 @@ class StripeAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
when (call.method) {
"initialise" -> stripeSdk.initialise(
publishableKey = call.requiredArgument("publishableKey"),
appInfo = call.requiredArgument("appInfo"),
params = call.optionalArgument("params"),
stripeAccountId = call.optionalArgument("stripeAccountId")
params = call.requiredArgument("params")
)
"createPaymentMethod" -> stripeSdk.createPaymentMethod(
data = call.requiredArgument("data"),
Expand All @@ -46,7 +43,7 @@ class StripeAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
)
"confirmSetupIntent" -> stripeSdk.confirmSetupIntent(
setupIntentClientSecret = call.requiredArgument("setupIntentClientSecret"),
data = call.requiredArgument("data"),
params = call.requiredArgument("data"),
options = call.requiredArgument("options"),
promise = Promise(result)
)
Expand All @@ -56,7 +53,7 @@ class StripeAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
)
"confirmPaymentMethod" -> stripeSdk.confirmPaymentMethod(
paymentIntentClientSecret = call.requiredArgument("paymentIntentClientSecret"),
data = call.requiredArgument("data"),
params = call.requiredArgument("params"),
options = call.requiredArgument("options"),
promise = Promise(result)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
package com.reactnativestripesdk

/*import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.RCTEventEmitter
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap

internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap<String, Any>, private val postalCodeEnabled: Boolean, private val complete: Boolean) : Event<CardChangedEvent>(viewTag) {
override fun getEventName(): String {
return EVENT_NAME
}
override fun dispatch(rctEventEmitter: RCTEventEmitter) {
rctEventEmitter.receiveEvent(viewTag, eventName, serializeEventData())
}
internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap<String, Any>, private val postalCodeEnabled: Boolean, private val complete: Boolean) {

private fun getValOr(map: MutableMap<String, Any>, key: String, default: String? = null): String? {
return if ((map[key] as CharSequence).isNotEmpty()) map[key] as String? else default
Expand All @@ -37,4 +30,4 @@ internal class CardChangedEvent constructor(viewTag: Int, private val cardDetail
const val EVENT_NAME = "onCardChange"
}

}*/
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,11 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/*package com.reactnativestripesdk
package com.reactnativestripesdk
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.RCTEventEmitter

internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?) : Event<CardFocusEvent>(viewTag) {
override fun getEventName(): String {
return EVENT_NAME
}
override fun dispatch(rctEventEmitter: RCTEventEmitter) {
rctEventEmitter.receiveEvent(viewTag, eventName, serializeEventData())
}
internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?) {

private fun serializeEventData(): WritableMap {
val eventData = Arguments.createMap()
Expand All @@ -30,4 +21,4 @@ internal class CardFocusEvent constructor(viewTag: Int, private val focusField:
const val EVENT_NAME = "onFocusChange"
}

}*/
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ internal fun mapConfirmationMethod(captureMethod: PaymentIntent.ConfirmationMeth
}
}

internal fun mapToReturnURL(urlScheme: String): String {
return "$urlScheme://safepay"
}

internal fun mapIntentShipping(shipping: PaymentIntent.Shipping): WritableMap {
val map: WritableMap = WritableNativeMap()
val address: WritableMap = WritableNativeMap()
Expand Down Expand Up @@ -92,6 +96,30 @@ internal fun mapPaymentMethodType(type: PaymentMethod.Type?): String {
}
}

internal fun mapToPaymentMethodType(type: String?): PaymentMethod.Type? {
return when (type) {
"Card" -> PaymentMethod.Type.Card
"Ideal" -> PaymentMethod.Type.Ideal
"Alipay" -> PaymentMethod.Type.Alipay
"AuBecsDebit" -> PaymentMethod.Type.AuBecsDebit
"BacsDebit" -> PaymentMethod.Type.BacsDebit
"Bancontact" -> PaymentMethod.Type.Bancontact
"AfterpayClearpay" -> PaymentMethod.Type.AfterpayClearpay
"CardPresent" -> PaymentMethod.Type.CardPresent
"Eps" -> PaymentMethod.Type.Eps
"Fpx" -> PaymentMethod.Type.Fpx
"Giropay" -> PaymentMethod.Type.Giropay
"GrabPay" -> PaymentMethod.Type.GrabPay
"Netbanking" -> PaymentMethod.Type.Netbanking
"Oxxo" -> PaymentMethod.Type.Oxxo
"P24" -> PaymentMethod.Type.P24
"SepaDebit" -> PaymentMethod.Type.SepaDebit
"Sofort" -> PaymentMethod.Type.Sofort
"Upi" -> PaymentMethod.Type.Upi
else -> null
}
}

internal fun mapFromBillingDetails(billingDatails: PaymentMethod.BillingDetails?): WritableMap {
val details: WritableMap = WritableNativeMap()
val address: WritableMap = WritableNativeMap()
Expand Down Expand Up @@ -188,9 +216,9 @@ internal fun mapFromPaymentIntentResult(paymentIntent: PaymentIntent): WritableM
map.putInt("created", convertToUnixTimestamp(paymentIntent.created))
map.putString("captureMethod", mapCaptureMethod(paymentIntent.captureMethod))
map.putString("confirmationMethod", mapConfirmationMethod(paymentIntent.confirmationMethod))
map.put("lastPaymentError", null)
map.put("shipping",null)
map.put("amount", null)
map.putNull("lastPaymentError")
map.putNull("shipping")
map.putNull("amount")
map.putNull("canceledAt")

paymentIntent.lastPaymentError?.let {
Expand Down Expand Up @@ -243,8 +271,7 @@ internal fun mapToPaymentMethodCreateParams(cardData: ReadableMap): PaymentMetho
if (cardData.hasKey("postalCode")) Address.Builder().setPostalCode(cardData.getString("postalCode").orEmpty()).build() else null,
if (cardData.hasKey("currency")) cardData.getString("currency") else null,
null)

return PaymentMethodCreateParams.createCard(cardParams)
return PaymentMethodCreateParams.createCard(cardParams)
}

internal fun mapToCard(card: ReadableMap): PaymentMethodCreateParams.Card {
Expand All @@ -260,29 +287,32 @@ fun getValOr(map: ReadableMap, key: String, default: String? = ""): String? {
return if (map.hasKey(key)) map.getString(key) else default
}

internal fun mapToBillingDetails(billingDatails: ReadableMap): PaymentMethod.BillingDetails {
internal fun mapToBillingDetails(billingDetails: ReadableMap?): PaymentMethod.BillingDetails? {
if (billingDetails == null) {
return null
}
val address = Address.Builder()
.setPostalCode(getValOr(billingDatails, "addressPostalCode"))
.setCity(getValOr(billingDatails, "addressCity"))
.setCountry(getValOr(billingDatails, "addressCountry"))
.setLine1(getValOr(billingDatails, "addressLine1"))
.setLine2(getValOr(billingDatails, "addressLine2"))
.setState(getValOr(billingDatails, "addressState"))
.setPostalCode(getValOr(billingDetails, "addressPostalCode"))
.setCity(getValOr(billingDetails, "addressCity"))
.setCountry(getValOr(billingDetails, "addressCountry"))
.setLine1(getValOr(billingDetails, "addressLine1"))
.setLine2(getValOr(billingDetails, "addressLine2"))
.setState(getValOr(billingDetails, "addressState"))
.build()

return PaymentMethod.BillingDetails.Builder()
.setAddress(address)
.setName(getValOr(billingDatails, "name"))
.setPhone(getValOr(billingDatails, "phone"))
.setEmail(getValOr(billingDatails, "email"))
.setName(getValOr(billingDetails, "name"))
.setPhone(getValOr(billingDetails, "phone"))
.setEmail(getValOr(billingDetails, "email"))
.build()
}

private fun getStringOrNull(map: ReadableMap?, key: String): String? {
return if (map?.hasKey(key) == true) map.getString(key) else null
}

private fun getIntOrNull(map: ReadableMap?, key: String): Int? {
fun getIntOrNull(map: ReadableMap?, key: String): Int? {
return if (map?.hasKey(key) == true) map.getInt(key) else null
}

Expand Down Expand Up @@ -432,7 +462,7 @@ internal fun mapSetupIntentUsage(type: StripeIntent.Usage?): String {
}
}

fun mapToPaymentIntentFutureUsage(type: String): ConfirmPaymentIntentParams.SetupFutureUsage {
fun mapToPaymentIntentFutureUsage(type: String?): ConfirmPaymentIntentParams.SetupFutureUsage {
return when (type) {
"OffSession" -> ConfirmPaymentIntentParams.SetupFutureUsage.OffSession
"OnSession" -> ConfirmPaymentIntentParams.SetupFutureUsage.OnSession
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package com.reactnativestripesdk

import com.facebook.react.bridge.ReadableMap
import com.stripe.android.model.*
import java.lang.Exception

class PaymentMethodCreateParamsFactory(private val clientSecret: String, private val params: ReadableMap, private val urlScheme: String?) {
private val billingDetailsParams = mapToBillingDetails(getMapOrNull(params, "billingDetails"))

@Throws(PaymentMethodCreateParamsException::class)
fun createConfirmParams(paymentMethodType: PaymentMethod.Type): ConfirmPaymentIntentParams {
try {
return when (paymentMethodType) {
PaymentMethod.Type.Card -> createCardPaymentConfirmParams()
PaymentMethod.Type.Ideal -> createIDEALPaymentConfirmParams(paymentMethodType)
else -> {
throw Exception("This paymentMethodType is not supported yet")
}
}
} catch (error: PaymentMethodCreateParamsException) {
throw error
}
}

@Throws(PaymentMethodCreateParamsException::class)
fun createSetupParams(paymentMethodType: PaymentMethod.Type): ConfirmSetupIntentParams {
try {
return when (paymentMethodType) {
PaymentMethod.Type.Card -> createCardPaymentSetupParams()
PaymentMethod.Type.Ideal -> createIDEALPaymentSetupParams(paymentMethodType)
else -> {
throw Exception("This paymentMethodType is not supported yet")
}
}
} catch (error: PaymentMethodCreateParamsException) {
throw error
}
}

@Throws(PaymentMethodCreateParamsException::class)
private fun createIDEALPaymentConfirmParams(paymentMethodType: PaymentMethod.Type): ConfirmPaymentIntentParams {
val bankName = getValOr(params, "bankName", null) ?: throw PaymentMethodCreateParamsException("You must provide bankName")

if (urlScheme == null) {
throw PaymentMethodCreateParamsException("You must provide urlScheme")
}

val idealParams = PaymentMethodCreateParams.Ideal(bankName)
val createParams = PaymentMethodCreateParams.create(ideal = idealParams, billingDetails = billingDetailsParams)

return ConfirmPaymentIntentParams
.createWithPaymentMethodCreateParams(
paymentMethodCreateParams = createParams,
clientSecret = clientSecret,
returnUrl = mapToReturnURL(urlScheme)
)
}

@Throws(PaymentMethodCreateParamsException::class)
private fun createCardPaymentConfirmParams(): ConfirmPaymentIntentParams {
val cardParams = getMapOrNull(params, "cardDetails")
val paymentMethodId = getValOr(params, "paymentMethodId", null)

if (cardParams == null && paymentMethodId == null) {
throw PaymentMethodCreateParamsException("You must provide cardDetails or paymentMethodId")
}

val setupFutureUsage = mapToPaymentIntentFutureUsage(getValOr(params, "setupFutureUsage"))

if (paymentMethodId != null) {
val cvc = getValOr(params, "cvc", null)
val paymentMethodOptionParams = if (cvc != null) PaymentMethodOptionsParams.Card(cvc) else null

return ConfirmPaymentIntentParams.createWithPaymentMethodId(
paymentMethodId = paymentMethodId,
paymentMethodOptions = paymentMethodOptionParams,
clientSecret = clientSecret
)
} else {
val card = mapToCard(cardParams!!)

val createParams = PaymentMethodCreateParams
.create(card, billingDetailsParams, null)

return ConfirmPaymentIntentParams
.createWithPaymentMethodCreateParams(
paymentMethodCreateParams = createParams,
clientSecret = clientSecret,
setupFutureUsage = setupFutureUsage
)
}
}

@Throws(PaymentMethodCreateParamsException::class)
private fun createIDEALPaymentSetupParams(paymentMethodType: PaymentMethod.Type): ConfirmSetupIntentParams {
val bankName = getValOr(params, "bankName", null) ?: throw PaymentMethodCreateParamsException("You must provide bankName")
val idealParams = PaymentMethodCreateParams.Ideal(bankName)
val createParams = PaymentMethodCreateParams.create(ideal = idealParams, billingDetails = billingDetailsParams)

if (urlScheme == null) {
throw PaymentMethodCreateParamsException("You must provide urlScheme")
}

return ConfirmSetupIntentParams.create(
paymentMethodCreateParams = createParams,
clientSecret = clientSecret,
returnUrl = mapToReturnURL(urlScheme)
)
}

@Throws(PaymentMethodCreateParamsException::class)
private fun createCardPaymentSetupParams(): ConfirmSetupIntentParams {
val cardParams = getMapOrNull(params, "cardDetails")

val card = cardParams?.let { mapToCard(it) } ?: run {
throw PaymentMethodCreateParamsException("You must provide cardDetails or paymentMethodId")
}

val paymentMethodParams = PaymentMethodCreateParams
.create(card, billingDetailsParams, null)

return ConfirmSetupIntentParams
.create(paymentMethodParams, clientSecret)
}
}

class PaymentMethodCreateParamsException(message:String): Exception(message)
Loading

0 comments on commit ffa7c25

Please sign in to comment.