贝宝支付:如何在 webview 中加载贝宝时获得成功请求
Paypal payment : How to get success request when loading the paypal in webview
编辑:
paypal登录后,我可以成功完成transaction.But我需要匹配paypal中的successUrl来验证两者url是否相同,然后显示成功吐司消息。
但是我没有从payment.So获得成功url我无法匹配it.Below我已经发布了相关代码:
WebActivity.java:
public class PaypalWebActivity extends Activity {
private WebView webView;
String payUrlStr;
ProgressDialog dialog;
String successUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paypal_web_layout);
successUrl = LOAD_WEBVIEW_PAYMENT_PAYPAL_SUCCESS;
dialog = ProgressDialog.show(PaypalWebActivity.this, "", "Please wait..", false);
loadWebViewPaypal();
}
private void loadWebViewPaypal() {
payUrlStr = LOAD_WEBVIEW_PAYMENT_PAYPAL(PAGE_ID);
Log.e("payUrlStr", ""+payUrlStr);
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl(payUrlStr);
webView.getSettings().setJavaScriptEnabled(true);
@SuppressWarnings("unused")
WebSettings settings= webView.getSettings();
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("Loading url...", url);
view.loadUrl(url);
String loadWebUrl = view.getUrl();
Log.e("loadWebUrl", ""+loadWebUrl);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
Log.e("Finished url...", url);
String webUrl = view.getUrl();
Log.e("webUrl", ""+webUrl);
if(webUrl.substring(0,95).equals(successUrl)){
Log.e("Getting Success Request", "Test");
}else{
Log.e("Failed to get Request", "Test");
}
if(dialog.isShowing()){
dialog.dismiss();
}
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Log.e("Error in url...", description);
Log.e("Error in failingUrl...", failingUrl);
}
});
}
}
清单:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
检查此 discussion。我一步一步地放了屏幕截图和添加的内容以便清楚地理解。
我收到此 错误 message.So 无法匹配成功请求:
06-15 18:12:59.894: I/chromium(3273): [INFO:CONSOLE(0)] "Mixed
Content: The page at
'https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce3e160f5b9538489e17951d2c62172'
was loaded over a secure connection, but contains a form which targets
an insecure endpoint
'http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4. this content should also be submitted over HTTPS.
https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce3e160f5b9538489e17951d2c62172
(0)
这是我的成功响应“http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4”-> 已更改服务器名称。
是否可以通过paypal匹配成功请求?如果我得到任何建议,这将对我有所帮助。
编辑
从屏幕截图看来,您正在将订阅页面嵌入到您的网络视图中,并试图将 successUrl
与 return URL.
相匹配
首先在您的个人资料中检查答案 in this post 以设置重新运行 URL
获取URLString webUrl = webView.getUrl();
如果要匹配/验证定义的successUrl
Paypal returns json 支付成功后的响应如下
{
"client": {
"environment": "sandbox",
"paypal_sdk_version": "2.14.1",
"platform": "Android",
"product_name": "PayPal-Android-SDK"
},
"response": {
"create_time": "2016-06-15T11:38:04Z",
"id": "PAY-6CN54299U76194116K5QT4BY",
"intent": "sale",
"state": "approved"
},
"response_type": "payment"
}
您需要检查响应 json 对象。如果状态被批准,则意味着 paypal 付款成功。然后您可以在 Paypal 网站上查看当前交易。
确保您已按照以下步骤操作:
1)
private static final int REQUEST_CODE_PAYMENT = 1;
private static String CONFIG_ENVIRONMENT=PayPalConfiguration.ENVIRONMENT_SANDBOX;
//直播模式为PayPalConfiguration.ENVIRONMENT_PRODUCTION。
2)
// note that these credentials will differ between live & sandbox environments.
private static final String CONFIG_CLIENT_ID = "ATBvU5urlaPOhpCrAhFsoG4u63RvNoKUocFPs9yR5q_sbM0yecZawUjoJhIilW8DNg5RrJcRHgRuEP_1";
private static PayPalConfiguration config = new PayPalConfiguration()
.environment(CONFIG_ENVIRONMENT)
.clientId(CONFIG_CLIENT_ID)
// The following are only used in PayPalFuturePaymentActivity.
.merchantName("Example Merchant")
.merchantPrivacyPolicyUri(Uri.parse("https://www.example.com/privacy"))
.merchantUserAgreementUri(Uri.parse("https://www.example.com/legal"));
Intent intent = new Intent(getActivity(), PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
getActivity().startService(intent);
如上所述,
您需要检查响应 json 对象。如果状态被批准,则意味着贝宝付款是 successful.then 您可以在贝宝网站上查看当前交易
我对您的查询的理解是,您的网站 URL 使用 Paypal 执行付款,而在移动应用程序中,您使用 Webview(不是 Paypal SDK)执行相同的操作。
是的,你可以在你的WEB端做一些编码得到callback
含义:
每当任何用户导航到支付页面时,您的服务器必须知道用户是从网站还是通过移动 Webview 访问的,服务器可以将 additional parameter key
发送到任何支付网关以用于其自定义逻辑。稍后一旦支付交易完成,支付网关将 return 与结果(成功或失败)一起 additional parameter key
。
注意:每个支付网关的设置都是Redirection url for Success/Failure
Once Paypal redirect to result url(Success/Failure) Transaction 完成后,服务器然后再次检查请求是从 Website 还是从 Mobile Webview 借助 additional parameter key
;检查下面的案例...
如果来自移动 Webview
- 成功:重定向到 URL
www.myserver.com/success
- 失败:重定向到 URL
www.myserver.com/failure
如果来自Webiew则Normal flow
现在在您手机的网络视图中
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
if(url.equalsIgnoreCase("www.myserver.com/success"))
//Success Toast
else if(url.equalsIgnoreCase("www.myserver.com/failure"))
//Failure Toast
return true;
}
});
就是这样。
我正在使用以下代码收到付款成功或失败请求:
private void loadWebViewPaypal() {
payUrlStr = LOAD_WEBVIEW_PAYMENT_PAYPAL(PAGE_ID);
Log.e("payUrlStr", "" + payUrlStr);
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new WebClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(payUrlStr);
@SuppressWarnings("unused")
WebSettings settings= webView.getSettings();
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}
}
public class WebClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.e("Page Started", ""+url);
super.onPageStarted(view, url, favicon);
if(url.contains(successUrl)) {
Log.e("Getting Success Request", "Test");
Intent i = new Intent(PaypalWebActivity.this, TabhostActivity.class);
PAYPAL_WEB_BACK = "fulfilled";
startActivity(i);
finish();
} else if(url.equalsIgnoreCase(failureUrl)) {
Intent i = new Intent(PaypalWebActivity.this, TabhostActivity.class);
PAYPAL_WEB_BACK = "fulfilled";
startActivity(i);
finish();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("Override Url", ""+url);
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
Log.e("Finished Url :", "" + url);
if(dialog.isShowing()){
dialog.dismiss();
}
}
}
编辑:
paypal登录后,我可以成功完成transaction.But我需要匹配paypal中的successUrl来验证两者url是否相同,然后显示成功吐司消息。
但是我没有从payment.So获得成功url我无法匹配it.Below我已经发布了相关代码:
WebActivity.java:
public class PaypalWebActivity extends Activity {
private WebView webView;
String payUrlStr;
ProgressDialog dialog;
String successUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paypal_web_layout);
successUrl = LOAD_WEBVIEW_PAYMENT_PAYPAL_SUCCESS;
dialog = ProgressDialog.show(PaypalWebActivity.this, "", "Please wait..", false);
loadWebViewPaypal();
}
private void loadWebViewPaypal() {
payUrlStr = LOAD_WEBVIEW_PAYMENT_PAYPAL(PAGE_ID);
Log.e("payUrlStr", ""+payUrlStr);
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl(payUrlStr);
webView.getSettings().setJavaScriptEnabled(true);
@SuppressWarnings("unused")
WebSettings settings= webView.getSettings();
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("Loading url...", url);
view.loadUrl(url);
String loadWebUrl = view.getUrl();
Log.e("loadWebUrl", ""+loadWebUrl);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
Log.e("Finished url...", url);
String webUrl = view.getUrl();
Log.e("webUrl", ""+webUrl);
if(webUrl.substring(0,95).equals(successUrl)){
Log.e("Getting Success Request", "Test");
}else{
Log.e("Failed to get Request", "Test");
}
if(dialog.isShowing()){
dialog.dismiss();
}
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Log.e("Error in url...", description);
Log.e("Error in failingUrl...", failingUrl);
}
});
}
}
清单:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
检查此 discussion。我一步一步地放了屏幕截图和添加的内容以便清楚地理解。
我收到此 错误 message.So 无法匹配成功请求:
06-15 18:12:59.894: I/chromium(3273): [INFO:CONSOLE(0)] "Mixed Content: The page at 'https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce3e160f5b9538489e17951d2c62172' was loaded over a secure connection, but contains a form which targets an insecure endpoint 'http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4. this content should also be submitted over HTTPS. https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce3e160f5b9538489e17951d2c62172 (0)
这是我的成功响应“http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4”-> 已更改服务器名称。
是否可以通过paypal匹配成功请求?如果我得到任何建议,这将对我有所帮助。
编辑
从屏幕截图看来,您正在将订阅页面嵌入到您的网络视图中,并试图将 successUrl
与 return URL.
首先在您的个人资料中检查答案 in this post 以设置重新运行 URL
获取URL
String webUrl = webView.getUrl();
如果要匹配/验证定义的successUrl
Paypal returns json 支付成功后的响应如下
{
"client": {
"environment": "sandbox",
"paypal_sdk_version": "2.14.1",
"platform": "Android",
"product_name": "PayPal-Android-SDK"
},
"response": {
"create_time": "2016-06-15T11:38:04Z",
"id": "PAY-6CN54299U76194116K5QT4BY",
"intent": "sale",
"state": "approved"
},
"response_type": "payment"
}
您需要检查响应 json 对象。如果状态被批准,则意味着 paypal 付款成功。然后您可以在 Paypal 网站上查看当前交易。
确保您已按照以下步骤操作:
1)
private static final int REQUEST_CODE_PAYMENT = 1;
private static String CONFIG_ENVIRONMENT=PayPalConfiguration.ENVIRONMENT_SANDBOX;
//直播模式为PayPalConfiguration.ENVIRONMENT_PRODUCTION。
2)
// note that these credentials will differ between live & sandbox environments.
private static final String CONFIG_CLIENT_ID = "ATBvU5urlaPOhpCrAhFsoG4u63RvNoKUocFPs9yR5q_sbM0yecZawUjoJhIilW8DNg5RrJcRHgRuEP_1";
private static PayPalConfiguration config = new PayPalConfiguration()
.environment(CONFIG_ENVIRONMENT)
.clientId(CONFIG_CLIENT_ID)
// The following are only used in PayPalFuturePaymentActivity.
.merchantName("Example Merchant")
.merchantPrivacyPolicyUri(Uri.parse("https://www.example.com/privacy"))
.merchantUserAgreementUri(Uri.parse("https://www.example.com/legal"));
Intent intent = new Intent(getActivity(), PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
getActivity().startService(intent);
如上所述,
您需要检查响应 json 对象。如果状态被批准,则意味着贝宝付款是 successful.then 您可以在贝宝网站上查看当前交易
我对您的查询的理解是,您的网站 URL 使用 Paypal 执行付款,而在移动应用程序中,您使用 Webview(不是 Paypal SDK)执行相同的操作。
是的,你可以在你的WEB端做一些编码得到callback
含义:
每当任何用户导航到支付页面时,您的服务器必须知道用户是从网站还是通过移动 Webview 访问的,服务器可以将 additional parameter key
发送到任何支付网关以用于其自定义逻辑。稍后一旦支付交易完成,支付网关将 return 与结果(成功或失败)一起 additional parameter key
。
注意:每个支付网关的设置都是Redirection url for Success/Failure
Once Paypal redirect to result url(Success/Failure) Transaction 完成后,服务器然后再次检查请求是从 Website 还是从 Mobile Webview 借助 additional parameter key
;检查下面的案例...
如果来自移动 Webview
- 成功:重定向到 URL
www.myserver.com/success
- 失败:重定向到 URL
www.myserver.com/failure
如果来自Webiew则Normal flow
现在在您手机的网络视图中
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
if(url.equalsIgnoreCase("www.myserver.com/success"))
//Success Toast
else if(url.equalsIgnoreCase("www.myserver.com/failure"))
//Failure Toast
return true;
}
});
就是这样。
我正在使用以下代码收到付款成功或失败请求:
private void loadWebViewPaypal() {
payUrlStr = LOAD_WEBVIEW_PAYMENT_PAYPAL(PAGE_ID);
Log.e("payUrlStr", "" + payUrlStr);
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new WebClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(payUrlStr);
@SuppressWarnings("unused")
WebSettings settings= webView.getSettings();
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}
}
public class WebClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.e("Page Started", ""+url);
super.onPageStarted(view, url, favicon);
if(url.contains(successUrl)) {
Log.e("Getting Success Request", "Test");
Intent i = new Intent(PaypalWebActivity.this, TabhostActivity.class);
PAYPAL_WEB_BACK = "fulfilled";
startActivity(i);
finish();
} else if(url.equalsIgnoreCase(failureUrl)) {
Intent i = new Intent(PaypalWebActivity.this, TabhostActivity.class);
PAYPAL_WEB_BACK = "fulfilled";
startActivity(i);
finish();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("Override Url", ""+url);
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
Log.e("Finished Url :", "" + url);
if(dialog.isShowing()){
dialog.dismiss();
}
}
}