Android Paypal支付:在webview中加载Paypal时如何获得成功请求

Android Paypal支付:在webview中加载Paypal时如何获得成功请求,android,paypal,paypal-sandbox,Android,Paypal,Paypal Sandbox,编辑: public class PaypalWebActivity extends Activity { private WebView webView; String payUrlStr; ProgressDialog dialog; String successUrl; @Override protected void onCreate(Bundle savedInstanceState)

编辑:

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" />
登录paypal后,我可以成功完成交易。但我需要匹配paypal中的successUrl,以验证两个url是否相同,然后显示SuccessToast消息

但我没有从付款中获得成功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" />
清单:

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/铬(3273):[信息:控制台(0)]“混合 内容:页面位于 'https://www.sandbox.paypal.com/us/cgi-bin/webscr?SESSION=LTy9Q59%5fia3wiAdHTQjgQxvUF1BTzLjgXgelCew4AS%2dGAutAfB5WjZXVuX8&dispatch=5885d80a13c0db1f8e263663d3faee8dcce3e160f5b9538489e17951d2c62172' 已通过安全连接加载,但包含一个以 不安全的终点 'http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4. 此内容也应通过HTTPS提交。 (0)

这是我的成功回应”http://www.myapi-entertainment.com/page_managements/page_featured_subscription_payment_success/4“->更改了服务器名称

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

编辑

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

  • 检查答案以首先在配置文件中设置retrun URL

  • 如果要与定义的
    成功URL进行匹配/验证,请获取URL
    字符串webUrl=webView.getUrl();


  • 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)
    
    私人静态最终整数请求\代码\付款=1;
    私有静态字符串配置\u环境=PayPalConfiguration.ENVIRONMENT\u沙盒;
    //这将是现场模式的PayPalConfiguration.ENVIRONMENT\u生产。 (二)

    如上所述


    你需要检查response json对象。如果状态为approved,则意味着paypal支付成功。然后你可以在paypal网站上检查当前交易

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

    ,您可以通过在WEB端进行一些编码来获得
    回调

    意思是:

    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" />
    
    每当任何用户导航到支付页面时,您的服务器必须知道用户是从网站访问还是通过移动Webview访问,服务器可以向任何支付网关发送
    附加参数键
    ,以获取其自定义逻辑。稍后,一旦支付交易完成,支付网关将返回相同的
    附加参数键
    伴随着结果(成功或失败)

    注意:每个支付网关都有一个成功/失败的
    重定向url设置

    交易完成后,一旦Paypal重定向到结果url(成功/失败),服务器将再次检查该请求是来自网站还是来自移动Webview,并借助
    附加参数键
    ;检查下面的案例

    如果来自移动网络视图

    • 成功:重定向到URL
      www.myserver.com/Success
    • 失败:重定向到URL
      www.myserver.com/Failure
    如果来自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;
                }
    
    });
    

    就是这样。

    我收到一个付款成功或失败的请求,使用以下代码:

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

    我想你需要在运行时请求许可。请将你的网页代码设置为
    payrlst
    ,你是否在其中集成了简单的支付按钮或PayPal Express API?@pp\u pduan我需要。你能过来一下吗?你能在服务器上启用https并使用https成功响应吗url@Naruto我已经通过fo集成了Paypal这和我的支付过程都很好。如果你在这方面有任何问题,请告诉我。我需要使用webview加载paypal。而且我没有任何paypal密钥。他们创建了帐户并允许登录。这是it@Naruto您有paypal登录凭据。您是否在paypal上创建了应用程序?请检查此项。我已逐步添加了专业版cedure.我不熟悉paypalOP,不使用Paypal MOBILE SDK,而是一个Web重定向。嗨,我尝试了你的答案。但我在日志中没有获得成功响应url。因此我无法处理该url。它(成功响应url)不会自动出现,您需要在服务器端编写代码。请阅读“含义”。@Stephen此答案包含示例代码的详细解释,因此这应该是公认的答案。