【问题标题】:Paypal payment : How to get success request when loading the paypal in webviewPaypal 付款:如何在 webview 中加载 paypal 时获得成功请求
【发布时间】:2016-09-30 10:02:21
【问题描述】:

编辑:

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

检查这个discussion。我一步一步放截图并添加内容以便清楚理解。

我收到此错误消息。因此无法匹配成功请求:

06-15 18:12:59.894: I/chromium(3273): [INFO:CONSOLE(0)] "混合 内容:页面位于 'https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce24870f5b9de5368 通过安全连接加载,但包含一个针对 不安全的端点 'http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4。此内容也应通过 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”-> 已更改服务器名称。

是否可以将成功请求与贝宝匹配?如果我得到任何建议,这将对我有所帮助。

【问题讨论】:

  • 我想你需要在运行时请求许可
  • 请提供您的网页代码payUrlStr,您是否集成了简单的支付按钮或PayPal Express API?
  • @pp_pduan 我需要discuss。你能过来一下吗?
  • 您能否在您的服务器上启用 https 并使用 https 成功响应 url

标签: android paypal paypal-sandbox


【解决方案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();
            }
        }
    }

【讨论】:

    【解决方案2】:

    我对您的查询的理解是,您有一个使用 Paypal 执行付款的网站 URL,而在移动应用程序中您使用 Webview(不是 Paypal SDK)执行相同操作。

    是的,您可以通过在您的 WEB 端进行一些编码来获得callback

    意思:

    当任何用户导航到支付页面时,您的服务器必须知道用户是从网站访问还是通过移动 Webview 访问,服务器可以将additional parameter key 发送到任何支付网关以获取其自定义逻辑。稍后一旦支付交易完成,支付网关将返回相同的additional parameter key 以及结果(成功或失败)。

    注意:每个支付网关都有一个设置Redirection url for Success/Failure

    一旦Paypal在交易完成后重定向到结果url(成功/失败),服务器然后再次在additional parameter key的帮助下检查请求是从网站还是从Mobile Webview发出的;检查下面的案例...

    如果来自 Mobile 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;
                }
    
    });
    

    就是这样。

    【讨论】:

    • 嗨,我试过你的答案。但我没有在日志中获得成功响应 url。所以我无法处理那个。
    • 它(成功响应url)不会自动出现,您需要在服务器端编码。阅读“意义”。
    • @Stephen 此答案包含示例代码的详细说明,因此这应该是公认的答案。
    【解决方案3】:

    如上所述,

    你需要检查响应 json 对象。如果状态获得批准,则表示贝宝付款成功。然后您可以在贝宝网站上查看当前交易情况

    【讨论】:

      【解决方案4】:

      编辑

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

      1. 查看答案in this post,首先在您的个人资料中设置返回网址

      2. 如果要与定义的successUrl进行匹配/验证,请获取URLString webUrl = webView.getUrl();

      【讨论】:

        【解决方案5】:

        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 对象。如果状态被批准,则意味着贝宝付款成功。然后您可以在 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,我的付款流程运行良好。如果您对此有任何问题,请告诉我。
        • 我需要使用 webview 来加载 paypal。而且我没有任何 paypal 密钥。他们创建了帐户并提供了登录访问权限。就是这样
        • @Naruto 您拥有贝宝登录凭据。您是否在 PayPal 上创建了应用程序??
        • 请查看discussion。我已经添加了一步一步的过程。我不熟悉贝宝
        • OP 不使用 Paypal MOBILE SDK,而是使用 Web 重定向。
        猜你喜欢
        • 2011-08-20
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 2012-04-22
        • 2011-11-21
        • 2014-04-03
        • 2020-05-28
        • 2015-07-17
        相关资源
        最近更新 更多