Handle PGW Payment Authentication
1. Handle PGW Payment Authentication Payment Flow
Refer to the sample code below for handling PGW payment authentications. This client callback will return a payment token, which merchants can to retrieve transaction details or manage transactions via API.
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.fragment.app.Fragment;
import com.ccpp.pgw.sdk.android.callback.PGWWebViewClientCallback;
import com.ccpp.pgw.sdk.android.callback.PGWWebViewTransactionStatusCallback;
import com.ccpp.pgw.sdk.android.core.authenticate.PGWWebViewClient;
public class PGWWebViewFragment extends Fragment {
private final String TAG = PGWWebViewFragment.class.getName();
private static final String ARG_REDIRECT_URL = "ARG_REDIRECT_URL";
private String mRedirectUrl;
public PGWWebViewFragment() { }
public static PGWWebViewFragment newInstance(String redirectUrl) {
PGWWebViewFragment fragment = new PGWWebViewFragment();
Bundle args = new Bundle();
args.putString(ARG_REDIRECT_URL, redirectUrl);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mRedirectUrl = getArguments().getString(ARG_REDIRECT_URL);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Step 5: Authentication handling for 3DS payment.
WebView webview = new WebView(getActivity());
//Optional
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setSupportZoom(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
//Mandatory
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true); //Some bank page required. eg: am bank
webview.setWebViewClient(new PGWWebViewClient(mTransactionStatusCallback, mWebViewClientCallback));
webview.loadUrl(mRedirectUrl);
return webview;
}
/**
* Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
*/
private final PGWWebViewTransactionStatusCallback mTransactionStatusCallback = new PGWWebViewTransactionStatusCallback() {
@Override
public void onInquiry(String paymentToken) {
//Do Transaction Status Inquiry API and close this WebView.
}
};
private final PGWWebViewClientCallback mWebViewClientCallback = new PGWWebViewClientCallback() {
@Override
public void shouldOverrideUrlLoading(String url) {
Log.i(TAG, "PGWWebViewClientCallback shouldOverrideUrlLoading : " + url);
}
@Override
public void onPageStarted(String url) {
Log.i(TAG, "PGWWebViewClientCallback onPageStarted : " + url);
}
@Override
public void onPageFinished(String url) {
Log.i(TAG, "PGWWebViewClientCallback onPageFinished : " + url);
}
};
}
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebSettings
import android.webkit.WebView
import androidx.fragment.app.Fragment
import com.ccpp.pgw.sdk.android.callback.PGWWebViewClientCallback
import com.ccpp.pgw.sdk.android.callback.PGWWebViewTransactionStatusCallback
import com.ccpp.pgw.sdk.android.core.authenticate.PGWWebViewClient
class PGWWebViewFragment private constructor() : Fragment() {
private lateinit var redirectUrl: String
companion object {
private val TAG: String = PGWWebViewFragment::class.java.name
private const val ARG_REDIRECT_URL: String = "ARG_REDIRECT_URL"
fun newInstance(redirectUrl: String): PGWWebViewFragment {
return PGWWebViewFragment().apply {
this.arguments = Bundle().apply {
this.putString(ARG_REDIRECT_URL, redirectUrl)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.redirectUrl = requireArguments().getString(ARG_REDIRECT_URL) ?: ""
}
@SuppressLint("SetJavaScriptEnabled")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
//Step 5: Authentication handling for 3DS payment.
val webview = WebView(requireActivity()).apply {
//Optional
this.settings.builtInZoomControls = true
this.settings.setSupportZoom(true)
this.settings.loadWithOverviewMode = true
this.settings.useWideViewPort = true
this.settings.cacheMode = WebSettings.LOAD_NO_CACHE
//Mandatory
this.settings.javaScriptEnabled = true
this.settings.domStorageEnabled = true //Some bank page required. eg: am bank
this.webViewClient = PGWWebViewClient(transactionStatusCallback, webViewClientCallback)
}
webview.loadUrl(this.redirectUrl)
return webview
}
/**
* Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
*/
private val transactionStatusCallback: PGWWebViewTransactionStatusCallback = object : PGWWebViewTransactionStatusCallback {
override fun onInquiry(paymentToken: String) {
//Do Transaction Status Inquiry API and close this WebView.
}
}
private val webViewClientCallback: PGWWebViewClientCallback = object : PGWWebViewClientCallback {
override fun shouldOverrideUrlLoading(url: String) {
Log.i(TAG, "PGWWebViewClientCallback shouldOverrideUrlLoading : $url")
}
override fun onPageStarted(url: String) {
Log.i(TAG, "PGWWebViewClientCallback onPageStarted : $url")
}
override fun onPageFinished(url: String) {
Log.i(TAG, "PGWWebViewClientCallback onPageFinished : $url")
}
}
}
#import "WKWebViewController.h"
#import <WebKit/WebKit.h>
@import PGW;
@interface PGWWebViewController ()
@property (nonatomic, strong) WKWebView *webView;
@property (nonatomic, strong) PGWWebViewNavigationDelegate *pgwWebViewNavigationDelegate;
@end
@implementation PGWWebViewController
- (void)viewDidLoad {
[super viewDidLoad];
//Step 5: Authentication handling for 3DS payment.
NSURL *requestUrl = [[NSURL alloc] initWithString: self.redirectUrl];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: requestUrl];
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
self.webView = [[WKWebView alloc] initWithFrame: UIScreen.mainScreen.bounds
configuration: webConfiguration];
self.webView.navigationDelegate = [self pgwTransactionResultCallback];
[self.webView loadRequest: request];
[self.view addSubview: self.webView];
}
/*
* Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
*/
- (PGWWebViewNavigationDelegate *)pgwTransactionResultCallback {
self.pgwWebViewNavigationDelegate = [[PGWWebViewNavigationDelegate alloc] initWithTransactionStatusCallback: ^(NSString * _Nonnull paymentToken) {
//Do Transaction Status Inquiry API and close this WebView.
}];
[self.pgwWebViewNavigationDelegate navigationCallbackWithDidStartProvisionalNavigation: ^(NSString * _Nonnull url) {
NSLog(@"PGWWebViewNavigationDelegate didStartProvisionalNavigation : %@", url);
} decidePolicyForNavigationAction: ^(NSString * _Nonnull url) {
NSLog(@"PGWWebViewNavigationDelegate didStartProvisionalNavigation : %@", url);
} didFinishNavigation: ^(NSString * _Nonnull url) {
NSLog(@"PGWWebViewNavigationDelegate didStartProvisionalNavigation : %@", url);
}];
return self.pgwWebViewNavigationDelegate;
}
@end
import Foundation
import UIKit
import WebKit
import PGW
class PGWWebViewController: UIViewController {
var webView: WKWebView!
var pgwWebViewNavigationDelegate: PGWWebViewNavigationDelegate!
var redirectUrl: String?
override func viewDidLoad() {
super.viewDidLoad()
//Step 5: Authentication handling for 3DS payment.
let requestUrl: URL = URL.init(string: self.redirectUrl!)!
let request: URLRequest = URLRequest.init(url: requestUrl)
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let webConfiguration = WKWebViewConfiguration()
webConfiguration.preferences = preferences
self.webView = WKWebView(frame: UIScreen.main.bounds, configuration: webConfiguration)
self.webView.navigationDelegate = self.pgwTransactionResultCallback()
self.webView.load(request)
self.view.addSubview(self.webView)
}
/*
* Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
*/
private func pgwTransactionResultCallback() -> PGWWebViewNavigationDelegate {
self.pgwWebViewNavigationDelegate = PGWWebViewNavigationDelegate({ (paymentToken: String) in
//Do Transaction Status Inquiry API and close this WebView.
})
self.pgwWebViewNavigationDelegate.navigationCallback(didStartProvisionalNavigation: { (url: String) in
print("PGWWebViewNavigationDelegate didStartProvisionalNavigation : \(url)")
}, decidePolicyForNavigationAction: { (url: String) in
print("PGWWebViewNavigationDelegate decidePolicyForNavigationAction : \(url)")
}, didFinishNavigation: { (url: String) in
print("PGWWebViewNavigationDelegate didFinishNavigation : \(url)")
})
return self.pgwWebViewNavigationDelegate
}
}
import 'package:flutter/material.dart';
import 'package:pgw_sdk/core/pgw_webview_navigation_delegate.dart';
import 'package:webview_flutter/webview_flutter.dart';
class PGWWebViewScreen extends StatelessWidget {
final String redirectUrl;
const PGWWebViewScreen({super.key, required this.redirectUrl});
// Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
WebViewController _webViewController() {
return WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(PGWNavigationDelegate(
// onNavigationRequest: (NavigationRequest request) {
// return NavigationDecision.navigate;
// },
onHttpAuthRequest: (HttpAuthRequest request) { },
onProgress: (int progress) { },
onPageStarted: (String url) { },
onPageFinished: (String url) { },
onWebResourceError: (WebResourceError error) { },
onUrlChange: (UrlChange change) { },
onInquiry: (String paymentToken) {
//Do Transaction Status Inquiry API and close this WebView.
}
)
)
..loadRequest(Uri.parse(redirectUrl));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('PGWWebViewScreen')
),
body: WebViewWidget(
controller: _webViewController()
)
);
}
}
import React from 'react';
import WebView from 'react-native-webview';
import { PGWWebViewNavigation } from '@2c2p/pgw-sdk-react-native';
export class PGWWebViewScreen extends React.Component<{redirectUrl: string}> {
constructor(props: {
redirectUrl: string;
}) {
super(props);
}
render(): React.ReactNode {
return (
<WebView
source={{uri: this.props.redirectUrl}}
javaScriptEnabled={true}
domStorageEnabled={true}
onNavigationStateChange={(event: any) => {
// Reference : https://developer.2c2p.com/docs/api-sdk-transaction-status-inquiry
PGWWebViewNavigation.inquiry(event.url ?? '', (paymentToken: string) => {
if(paymentToken) {
//Do Transaction Status Inquiry API and close this WebView.
}
});
}}
/>
);
}
}
2. Initiate Transaction Status Inquiry
To retrieve transaction details and status, merchants must initiate the Transaction Status Inquiry API. Refer to the sample code below.
Transaction Status Inquiry API
Refer to: Transaction Status Inquiry API
Updated 4 days ago