PayPal付款:如何在Webview加载PayPal时成功请求

20

编辑:

在Paypal登录后,我成功完成了交易。但我需要匹配paypal中的successUrl,以验证两个URL是否相同,并显示成功的toast消息。

但是我无法从付款中获得成功URL。因此我无法匹配它。下面是相关代码:

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" />

请查看这个讨论。我逐步添加了截图和内容以便清晰理解。

我遇到了错误信息,因此无法匹配成功请求:

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匹配吗? 如果我得到任何建议,对我会很有帮助。


我认为你需要在运行时请求权限。 - Preethi Rao
请参考以下链接:https://dev59.com/gJffa4cB1Zd3GeqP728x#37458251 - Preethi Rao
请放上你的网页代码 payUrlStr,你是使用简单付款按钮还是PayPal Express API进行集成? - pp_pduan
@pp_pduan 我需要讨论,你能去那里吗? - Stephen
你能在你的服务器上启用https并使用一个https成功响应URL吗? - rdx
@Nurato 如果你还没有HTTPS,可以使用letsencrypt.org来启用它。 - rdx
5个回答

7
Paypal在成功付款后返回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对象。如果状态为“approved”,那么表示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);

@Naruto 我已经按照这个教程集成了Paypal,我的支付流程正常工作。如果你在使用过程中遇到任何问题,请告诉我。 - Roshni jain
我需要使用webview来加载PayPal。此外,我没有任何PayPal密钥。他们创建了帐户并提供了登录访问权限。就这样。 - Stephen
@Naruto 你有PayPal的登录凭据。你在PayPal上创建了应用程序吗? - Roshni jain
请查看这个讨论。我已经添加了逐步的操作步骤。我不熟悉Paypal。 - Stephen
1
运营商没有使用 Paypal MOBILE SDK,而是使用了 Web 重定向。 - Mohammed Azharuddin Shaikh

6
我理解你的问题是,你有一个使用Paypal进行付款的网站URL,在移动应用程序中,您使用Webview(而不是Paypal SDK)执行相同的操作。
是的,你可以通过在你的WEB端编写代码来获取回调。
意思是:每当用户访问付款页面时,您的服务器都必须知道用户是从网站还是通过移动Webview访问的。服务器可以向任何付款网关发送附加参数键以进行自定义逻辑。稍后,一旦支付交易完成,支付网关将返回相同的“附加参数键”以及结果(成功或失败)。
注意:每个支付网关都有一个用于成功/失败的重定向网址设置。
一旦Paypal在交易完成后重定向到结果网址(成功/失败),服务器会再次检查请求是从网站还是从移动Webview发出的,这可以通过“附加参数键”来实现。请参考以下情况:
如果来自移动Webview - 成功:重定向到网址www.myserver.com/success - 失败:重定向到网址www.myserver.com/failure 如果来自Webiew,则执行正常流程。
现在在您的移动Webview中。
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;
            }

});

就是这样。


嗨,我尝试了你提供的答案。但是我在日志中没有收到成功响应的URL。所以我无法处理那个。 - Stephen
成功响应的URL不会自动出现,您需要在服务器端编写代码。请阅读“含义”。 - Mohammed Azharuddin Shaikh
@Stephen 这个答案包含了详细的解释和示例代码,因此应该被接受为正确答案。 - Dharmendra

4

编辑

从界面截图来看,您正在将订阅页面嵌入到您的Webview中,并尝试将successUrl与返回URL匹配。

  1. 首先,请检查此帖子中的答案,设置返回URL以在您的配置文件中进行设置

  2. 如果要使用定义的successUrl进行匹配/验证,则需要获取URL String webUrl = webView.getUrl();


1
如上所述,您需要检查响应的 JSON 对象。如果状态为“批准”,那么意味着 PayPal 支付已成功。然后,您可以在 PayPal 网站上检查当前交易。

1

我正在使用以下代码获取支付成功或失败的请求:

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();
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接