1.前言
去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步给大家介绍下。
一、支付宝支付
二、微信支付
三、下面我直接上代码了哈
首先导入对应支付平台下载的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啦.