Android(安卓)集成微信支付和支付宝支付工具类
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 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) 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(); }}
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 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; }}
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 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(); }}
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 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 getReturnData() { return ReturnData; } public void setReturnData(List 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; } }}
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" />
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>
6.下面我们看下调用的地方,其实很简单:
/* * 支付宝支付方法 * */ private void initAlipay(String type) { Api.getApi().getRechargePay(CacheService.getIntance().getUserId(), payMoney, type) .compose(callbackOnIOToMainThread()) .subscribe(new BaseNetSubscriber(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(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.首先按照微信的签名的话,一般步骤都可以往下走,但是有一点需要注意就是签完名之后,如果你打包成正式版的话也就是releasea签名的话要用正式的包安装才能唤起微信,否则会出错的,如果要是想使用Dug签名的话,你要把签名后的keystore替换掉android studio的默认签名就可以使用了。
2.上面这些类是我从自己项目整理出来的,你们拿来用,稍微改下就行。
2.一般来说 遇到比较多问题 返回 -1,这种问题网上也有对应的链接解决的,比如参数配置,后台返回的信息是不是有问题,这些小伙伴们注意一下就ok啦.
好啦以上就分享到这里,平时我也比较懒,博客写的少,哈哈,哪里写的不好的地方 希望各位大神多多指教,有好的建议留言或者 加qq** 2585760090 (记得备注下哈)**
更多相关文章
- 如何使用android的ndk建立native的开发环境
- Android安装应用失败UID 和 PID
- 通过signapk.jar 为Android(安卓)应用程序签名,并优化签名后的APK
- Android(安卓)jni GetFieldID 和 GetMethodID 函数的说明
- android微信支付源码分享
- Android(安卓)使用 apksigner 对未签名的APK安装包进行签名
- 庆祝一下,Android视频采集+H264编码成功
- Android(安卓)Studio Gradle中配置release的签名
- Android支付宝支付封装代码