Android 集成微信支付和支付宝支付工具类

1.前言
去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步给大家介绍下。

一、支付宝支付

1.支付宝官方集成文档
2.支付宝官方资源下载

二、微信支付

1.微信官方的集成文档
2.微信官方资源下载

三、下面我直接上代码了哈
首先导入对应支付平台下载的SDK里面的jar

如图所示:

1.PayHelper 支付类:

package com.more.org.utils;

import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.more.org.WEXModel;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;


import java.util.Map;

/**
 * Created by Administrator on 2017/5/23.
 * 支付类
 */

public class PayHelper {

    private static PayHelper mPayHelper = null;

    public static PayHelper getInstance() {
        if (mPayHelper == null) {
            mPayHelper = new PayHelper();
        }
        return mPayHelper;
    }

    public PayHelper() {

    }

    IWXAPI msgApi = null;

    public void WexPay(WEXModel.ReturnDataBean data) {
        if (msgApi == null) {
            msgApi = WXAPIFactory.createWXAPI(MyApplication.getInstance(), null);
            msgApi.registerApp(Constant.WEXAPPID);// 将该app注册到微信
        }
        PayReq req = new PayReq();
        if (!msgApi.isWXAppInstalled()) {
            Toast.makeText(MyApplication.getInstance(), "手机中没有安装微信客户端!", Toast.LENGTH_SHORT).show();

            return;
        }
        if (data != null) {

            req.appId = data.getAppid();
            req.partnerId = data.getPartnerid();
            req.prepayId = data.getPrepayid();
            req.nonceStr = data.getNoncestr();
            req.timeStamp = data.getTimestamp() + "";
            req.packageValue = data.getPackageX();
            req.sign = data.getSign();
            // req.extData = MaiLiApplication.getInstance().getUserInfo().getPhone();  微信拓展参数
            msgApi.sendReq(req);
        }
    }

    public void AliPay(Activity activity, final String orderInfo) {
        final PayTask alipay = new PayTask(activity);
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {

                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());
                Message msg = new Message();
                msg.what = 0;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        if (mIPayListener != null) {
                            mIPayListener.onSuccess();
                        }
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        if (mIPayListener != null) {
                            mIPayListener.onFail();
                        }
                    }
                    break;
            }
        }
    };
    private IPayListener mIPayListener;

    public void setIPayListener(IPayListener mIPayListener) {
        this.mIPayListener = mIPayListener;
    }

    public interface IPayListener {
        void onSuccess();

        void onFail();
    }
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126

2.PayResult看命名就知道 支付结果类:

package com.more.org.utils;

import android.text.TextUtils;

import java.util.Map;

public class PayResult {
    private String resultStatus;
    private String result;
    private String memo;

    public PayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

3.WXPayEntryActivity类(放在wxapi包名下):
如图所示:

package com.more.org.wxapi;

import android.content.Intent;
import android.widget.Toast;

import com.more.org.BaseActivity;
import com.more.org.BasePresenter;
import com.more.org.R;
import com.more.org.databinding.ActivityPayResultBinding;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;




public class WXPayEntryActivity extends BaseActivity<BasePresenter,ActivityPayResultBinding> implements IWXAPIEventHandler {

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

    private IWXAPI api;


//    @Override
//    public int getLayoutId() {
//        return R.layout.activity_pay_result;
//    }
//
//    @Override
//    protected boolean isTitleBar() {
//        return false;
//    }
//
//    @Override
//    protected boolean isPrestener() {
//        return false;
//    }
//
//    @Override
//    protected BasePresenter createPresenter() {
//        return null;
//    }
//
    @Override
    public void initData() {
        super.initData();
        api = WXAPIFactory.createWXAPI(this, Constant.WEXAPPID);
        api.handleIntent(getIntent(), this);
      }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    @Override
    public void onResp(BaseResp resp) {
        int code = resp.errCode;
        String transaction = resp.transaction;
        String errStr = resp.errStr;
        if (code == 0) {
            mBinding.tvResult.setText("充值成功了!");
            //显示充值成功的页面和需要的操作
            //EventBus.getDefault().post("微信支付成功");//微信支付成功
            Toast.makeText(aty, "充值成功了!", Toast.LENGTH_SHORT).show();
        }
        if (code == -1) {
            //错误    可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
            mBinding.tvResult.setText("充值失败!");
            Toast.makeText(aty, "充值失败!", Toast.LENGTH_SHORT).show();
        }

        if (code == -2) {
            mBinding.tvResult.setText("用户取消了!");
            Toast.makeText(aty, "用户取消了!", Toast.LENGTH_SHORT).show();
            //用户取消
        }
       // finish();

    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

4.WEXModel实体类:(根据自己服务器返回的数据定义)

package com.more.org;

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;
import java.util.List;

/**
 * Created by Administrator on 2017/5/23.
 */

public class WEXModel implements Serializable {


    /**
     * ReturnCode : 1
     * ReturnMessage :
     * ReturnData : 服务器返回的josn数据
     */

    private String ReturnCode;
    private String ReturnMessage;
    private List<ReturnDataBean> ReturnData;

    public String getReturnCode() {
        return ReturnCode;
    }

    public void setReturnCode(String ReturnCode) {
        this.ReturnCode = ReturnCode;
    }

    public String getReturnMessage() {
        return ReturnMessage;
    }

    public void setReturnMessage(String ReturnMessage) {
        this.ReturnMessage = ReturnMessage;
    }

    public List<ReturnDataBean> getReturnData() {
        return ReturnData;
    }

    public void setReturnData(List<ReturnDataBean> ReturnData) {
        this.ReturnData = ReturnData;
    }

    public static class ReturnDataBean {
        /**
         * appid : //对应的参数后台返回
         * partnerid : 
         * prepayid : 
         * package : Sign=WXPay
         * noncestr : 
         * timestamp : 1521789303
         * sign : 
         */

        private String appid;
        private String partnerid;
        private String prepayid;
        @SerializedName("package")
        private String packageX;
        private String noncestr;
        private String timestamp;
        private String sign;

        public String getAppid() {
            return appid;
        }

        public void setAppid(String appid) {
            this.appid = appid;
        }

        public String getPartnerid() {
            return partnerid;
        }

        public void setPartnerid(String partnerid) {
            this.partnerid = partnerid;
        }

        public String getPrepayid() {
            return prepayid;
        }

        public void setPrepayid(String prepayid) {
            this.prepayid = prepayid;
        }

        public String getPackageX() {
            return packageX;
        }

        public void setPackageX(String packageX) {
            this.packageX = packageX;
        }

        public String getNoncestr() {
            return noncestr;
        }

        public void setNoncestr(String noncestr) {
            this.noncestr = noncestr;
        }

        public String getTimestamp() {
            return timestamp;
        }

        public void setTimestamp(String timestamp) {
            this.timestamp = timestamp;
        }

        public String getSign() {
            return sign;
        }

        public void setSign(String sign) {
            this.sign = sign;
        }
    }
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126

5.AndroidManifest清单文件配置相关信息:

1.添加必要权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

2.注册信息

       <!-- 支付宝 -->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" />
        <activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" />

        <!-- 微信支付回调函数 -->
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="这里替换自己申请的scheme" />
            </intent-filter>
        </activity>
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

6.下面我们看下调用的地方,其实很简单:

   /*
    * 支付宝支付方法
    * */
    private void initAlipay(String type) {
        Api.getApi().getRechargePay(CacheService.getIntance().getUserId(), payMoney, type)
                .compose(callbackOnIOToMainThread())
                .subscribe(new BaseNetSubscriber<BaseBean>(true) {
                    @Override
                    public void onNext(BaseBean baseBean) {
                        super.onNext(baseBean);
                        PayHelper.getInstance().AliPay(aty, String.valueOf(baseBean.getReturnData()));
                        PayHelper.getInstance().setIPayListener(new PayHelper.IPayListener() {
                            @Override
                            public void onSuccess() {
                                showToast("支付成功!");
                                new Thread() {
                                    @Override
                                    public void run() {
                                        super.run();
                                        try {
                                            sleep(1000);
                                        } catch (InterruptedException e) {
                                        }
                                        EventBus.getDefault().post(new MineUpdateEvent());//更新价格
                                        finish();
                                    }
                                }.start();
                            }

                            @Override
                            public void onFail() {
                                showToast("支付失败!");
                            }
                        });
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });

    }

    /*
    * 微信支付方法
    * */
    private void initWexPay(String type) {
        Api.getApi().getRechargePay1(CacheService.getIntance().getUserId(), payMoney, type)
                .compose(callbackOnIOToMainThread())
                .subscribe(new BaseNetSubscriber<WEXModel>(true) {
                    @Override
                    public void onNext(WEXModel wexModel) {
                        super.onNext(wexModel);
                        if (wexModel.getReturnData() != null && wexModel.getReturnData().size() > 0) {
                            PayHelper.getInstance().WexPay(wexModel.getReturnData().get(0));
                        } else {
                            showToast("信息错误!");
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });

    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

以上就是微信支付和支付宝支付所有代码了,哈哈是不是发现好简单!
关于微信的签名要说明的问题:
1.首先按照微信的签名的话,一般步骤都可以往下走,但是有一点需要注意就是签完名之后,如果你打包成正式版的话也就是releasea签名的话要用正式的包安装才能唤起微信,否则会出错的,如果要是想使用Dug签名的话,你要把签名后的keystore替换掉android studio的默认签名就可以使用了。
2.上面这些类是我从自己项目整理出来的,你们拿来用,稍微改下就行。
2.一般来说 遇到比较多问题 返回 -1,这种问题网上也有对应的链接解决的,比如参数配置,后台返回的信息是不是有问题,这些小伙伴们注意一下就ok啦.

发布了272 篇原创文章 · 获赞 165 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_32534441/article/details/104869696