android 支付宝之网页支付和快捷支付

参考资料:

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash

 

--- 网页支付

复制代码
http://wappaygw.alipay.com/service/rest.htm?
req_data=
<direct_trade_create_req>
<subject>12121212</subject>
<out_trade_no>12121021</out_trade_no>
<total_fee>1</total_fee>
<seller_account_name>che12121</seller_account_name>
<notify_url>http://www.alipay.com/waptest0504/servlet/NotifyReceiver</notify_url>
<out_user>outID123</out_user>
<merchant_url>http://www.alipay.com</merchant_url>
<pay_expire>10</pay_expire>
</direct_trade_create_req>
&service=alipay.wap.trade.create.direct
&sec_id=0001&partner=12112
&req_id=11121212
&sign=bDfw5%2Bctc3pxzl7emPxqOod4EiPu3BkE0 Um54g4whHT22CwLbOn1gzyE%2BU5SIleGPke2rNQ%3D
&format=xml
&v=2.0
复制代码

网页支付拿这服务器返回的地址,通过webview直接请求就可以

复制代码
public class AlipayWebActivity extends Activity {
    private WebView mWebView;
    private ProgressDialog mProgressDialog;
    private static final String TAG = "AlipayWebActivity";
    protected static final int PAY_SUCCESS = 20;
    protected static final int LOAD_FINISH_CODE = 40;
    private static final int DEFAULT_CODE = 50;
    
    private ImageView quitImageView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web);
        FactoryUtil.getInstance().addActivity(this);
        
        quitImageView = (ImageView) findViewById(R.id.iv_quit);
        
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.setBackgroundColor(0);
        
        initial();
        
        quitImageView.setOnClickListener(new MyOnClickListener());
    }

    @SuppressLint({ "SetJavaScriptEnabled", "HandlerLeak" })
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void initial() {
        String url = getIntent().getStringExtra("url");
        LogUtil.i(TAG, url);
        WebSettings webSettings = mWebView.getSettings();
        mWebView.requestFocus();
        webSettings.setJavaScriptEnabled(true);
        mWebView.setFocusable(true);
        webSettings.setBuiltInZoomControls(true);

        mWebView.setScrollBarStyle(0);
        if (MobileUtil.getMobileVersion()>11) {        
            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        mWebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int newProgress) {
                LogUtil.i(TAG, "newProgress: " + newProgress);
                if (newProgress == 100 && mProgressDialog!=null) {
                    mProgressDialog.dismiss();
                }
                super.onProgressChanged(view, newProgress);
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                LogUtil.i(TAG, "URL : " + url);
                LogUtil.i(TAG, "URL : " + url.contains("&cmd=success&"));
                loadUrl(view, url);
                return true;//停止在当前界面
            }
            public void onPageFinished(WebView view, String url) {
                LogUtil.i(TAG, "onPageFinished" + url);
                //trade_status : TRADE_FINISHED,成功之后处理

super.onPageFinished(view, url); } public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); LogUtil.i(TAG, "onPageStarted" + url); } }); loadUrl(mWebView, url); } @SuppressLint("HandlerLeak") private Handler mUihandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case PAY_SUCCESS: clearCache(); FactoryUtil.getInstance().exit(); break; case LOAD_FINISH_CODE: if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } break; case DEFAULT_CODE: showProgressDialog(AlipayWebActivity.this, R.string.dialog_loading); } super.handleMessage(msg); } }; private void loadUrl(final WebView webView, final String url) { mUihandler.sendEmptyMessage(DEFAULT_CODE); webView.loadUrl(url); } public boolean onKeyDown(int keyCode, KeyEvent event) { LogUtil.i(TAG, "can goback:" + mWebView.canGoBack()); if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack(); return true; } else if (keyCode == KeyEvent.KEYCODE_BACK) { onBackPressed(); return true; } return super.onKeyDown(keyCode, event); } public void showProgressDialog(Context context, int message) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(context); mProgressDialog.setMessage(context.getText(message)); mProgressDialog.show(); } } private void clearCache() { mWebView.clearCache(true); mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); finish(); } private class MyOnClickListener implements OnClickListener{ @Override public void onClick(View v) { int id = v.getId(); if (id==R.id.iv_quit) { finish(); } } } }
复制代码

--- 快捷支付
1、公钥,密钥,签名在服务器端完成,比放在客户端安全。
2、报4000 4100一般就是参数出现错误,仔细比对,如果参数都没问题,很有可能是sign也就是签名没有通过。签名之后不能对已经签名的字符串做任何修改,因为支付宝需要解密的。
3、如果报服务器繁忙,然后打印出参数非法的警告信息时, KeyFactory.getInstance("RSA", "BC") 可以解决。
4、sign签名要utf-8格式。

 

复制代码
/*
 * Copyright (C) 2010 The MobileSecurePay Project
 * All right reserved.
 * author: shiqun.shi@alipay.com
 */

package com.ztgame.dudu.payment.alipay;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

import com.alipay.android.app.sdk.AliPay;
import com.ztgame.dudu.payment.R;
import com.ztgame.dudu.payment.ui.FactoryUtil;
import com.ztgame.dudu.payment.util.BaseDialogUtil;
import com.ztgame.dudu.payment.util.LogUtil;

public class AlipayUtil {

    private static String TAG = "AlipayUtil";
    private Activity activity;
    private String order;
    private static final int RQF_PAY = 1;

    private static final int RQF_LOGIN = 2;

    public AlipayUtil(Activity activity, String order) {
        this.activity = activity;
        this.order = order;
        LogUtil.i(TAG, activity.toString() + " "
                + activity.getMainLooper().toString());
    }


    public void pay() {
        // 根据订单信息开始进行支付
        try {

            new Thread() {
                public void run() {
                    AliPay alipay = new AliPay(activity, mHandler);
                    String result = alipay.pay(order);
                    Message msg = new Message();
                    msg.what = RQF_PAY;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            }.start();
        } catch (Exception ex) {
            Toast.makeText(activity, R.string.pay_fail,Toast.LENGTH_SHORT).show();
            activity.finish();
        }
    }

    Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Result result = new Result((String) msg.obj);
            switch (msg.what) {
            case RQF_PAY:
            case RQF_LOGIN: {
                try {
                    String ret = result.getResult();
                    result.parseResult();
                    LogUtil.i(TAG, ret);
                    LogUtil.i(TAG, "1: " + result.isSignOk + " 2: "
                            + result.memo + " 3: " + result.resultStatus);
                    // 先验签通知
                    // 1: false 2: 3: 操作成功(9000)
                    // 验签失败
                    if (result.isSignOk) {
                        Toast.makeText(activity, R.string.check_sign_fail, Toast.LENGTH_SHORT).show();
                    } else {// 验签成功。验签成功后再判断交易状态码
                        if ("操作成功(9000)".equals(result.resultStatus)) {// 判断交易状态码,只有9000表示交易成功
                               

                  //成功之后执行

}); } else { Toast.makeText(activity, "支付失败。交易状态码:" + result.resultStatus, Toast.LENGTH_SHORT).show(); } } } catch (Exception e) { e.printStackTrace(); Toast.makeText(activity, R.string.pay_fail, Toast.LENGTH_SHORT).show(); } } break; default: break; } }; }; }
复制代码

 剩下的文档里面都有,只需要处理的是支付成功与失败的逻辑。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Uni-app是一种跨平台的开发框架,可以方便地开发出适用于多个终端的应用程序,包括Web、iOS、Android等。在开发过程中,我们可以使用uni-app提供的API实现多种功能,比如调用微信支付。 首先,我们需要在应用程序内引入微信支付所需的SDK,在Uni-app中可以使用插件机制,自己开发一个插件或者使用已有的插件,如uni-wxpay等。然后,在APP内调用微信支付的流程如下: 1.在创建支付订单时,需要将订单信息传递给服务端,由服务端生成订单号、调用微信支付API生成预支付订单,并返回给APP。 2.APP拿到预支付订单后,调用微信SDK内置的API进行支付,主要包括支付参数的配置和支付的发起。 3.支付完成后,微信会回调我们在服务端注册的回调地址,服务端通过请求微信的API对支付结果进行核对,确认支付是否成功,并作出相应的处理。 需要注意的是,在调用微信支付API时需要在微信开放平台申请开发者账号,并完成相应的配置,包括设置支付回调地址、支付授权目录等等。 总之,通过调用微信支付API,我们可以为APP添加支付功能,实现线上商品购买、捐赠赞赏等功能。而在Uni-app中,使用插件机制可以更加方便快捷地完成这个流程。 ### 回答2: uni-app 是一个可以跨平台开发的框架,它支持开发微信小程序、支付宝小程序、H5 等多个平台。在 uni-app 中内调用微信支付可以实现用户在应用内进行支付,下面我将具体介绍 uni-app 中如何进行内调用微信支付。 1. 首先需要在应用中安装微信支付插件,打开 HBuilderX,选择菜单栏中的“插件市场”,搜索“微信支付”,选择安装。 2. 在应用中使用微信支付的页面中引入微信支付插件: ```javascript import $payment from "@/uni_modules/yk-payment/js_sdk/uni-payment.js"; // 引入插件 ``` 3. 在需要支付的位置,调用微信支付的方法: ```javascript uni.showLoading({ title: '加载中' }); $payment.weixinPay({ timeStamp: '1603388794', nonceStr: '5pnskrq5060pt2lljndzpta9hzqmxrsq', package: 'prepay_id=wx30163954528026d7bf482abf2becd37124', signType: 'MD5', paySign: '3ACA84580DD8C32D8478B4BBF3688A1D', success: function (res) { console.log('success:' + JSON.stringify(res)); }, fail: function (err) { console.log('fail:' + JSON.stringify(err)); }, complete: function (res) { uni.hideLoading(); } }); ``` 其中,微信支付需要提供以下参数: - timeStamp:时间戳,单位为秒 - nonceStr:随机字符串,不长于 32 位 - package:统一下单接口返回的 prepay_id,参考[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)中获取订单号 - signType:签名算法,目前支持 MD5 和 HMAC-SHA256 - paySign:签名,具体签名方式详见[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) 微信支付成功后会回调 success 回调函数,失败则回调 fail 回调函数。 4. 在微信支付的后端接口中,需要根据微信支付返回的结果进行签名校验,确保订单的真实性。 综上所述,使用 uni-app 内调用微信支付步骤相对简单,只需安装微信支付插件,调用支付方法即可,但支付过程中需要注意时间戳、随机字符串、签名等参数的正确性,同时在后端接口中校验微信支付的签名以确保支付的真实性。 ### 回答3: Uni-app是一个跨平台开发框架,它可以让开发者一次编写代码,同时在多个平台上运行。微信支付是一个广为人知的移动支付平台,它可以提供便捷的支付服务。在实践中,我们可以使用Uni-app中的支付插件来在应用程序中调用微信支付。下面是如何实现Uni-app应用程序内调用微信支付: 1. 首先,安装支付插件在Uni-app开发环境中,可以通过npm安装。 2. 在支付插件内部,我们需要引用微信支付的API,以便在我们的应用程序中调用这些API来实现支付。这些API包括支付API、查询订单API、退款API等等。 3. 接下来,我们需要在我们的代码中调用支付API,这个API用于请求加载微信支付。当用户点击订单支付按钮时,我们可以在后台发送一个请求,请求加载微信支付页面和所需的支付参数。 4. 在向微信支付发送请求后,我们需要接收来自微信支付的响应,然后将结果传递给我们的应用程序。通常,微信支付会将支付结果返回给我们的后台服务器,然后我们可以将结果传递给我们的应用程序。我们可以使用Uni-app的API来轮询服务器以获取结果。 5. 最后,我们需要在我们的应用程序中向用户显示支付结果。如果支付成功,我们可以向用户显示订单确认信息。如果支付失败,我们可以向用户显示错误信息。 总之,Uni-app应用程序的开发者可以使用插件实现在应用程序中调用微信支付。开发者需要在插件内部引用微信支付API,然后在代码中调用它们来实现支付。最后,我们需要接收来自微信支付的响应,并在我们的应用程序中向用户显示支付结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值