项目中要用到支付功能,须要支付宝支付、微信支付、银联支付,因此打算总结一下,方便之后的查阅,也方便你们, 用到的地方避免再次被坑。 今天咱们就主要介绍一下微信支付,其余支付也写了对应教程,而且给出了链接。php
集成前首先要看看文档,微信支付开发文档里面有详细的字段和说明。 微信支付是须要签名的,跟支付宝同样,能够在客户端签名,也能够在后台签名(固然,为了安全仍是推荐在服务器上作签名,逻辑也比较好理解)html
如下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。android
商户系统和微信支付系统主要交互说明:json
微信开放平台下载SDK 建议把Android头文件和支付示例都下载下来后端
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的惟一标识APPID。因为须要保证支付安全,须要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。以下图:api
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的。安全
package="net.sourceforge.simcpux"
复制代码
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,以下图所示,绿色串即应用签名。bash
签名工具下载地址服务器
open.weixin.qq.com/zh_CN/htmle…微信
net.sourceforge.simcpux 是项目包名
导入sdk流程同支付宝导入流程同样,这里就借用支付宝导入流程进行介绍。
1.将alipaySDK-20150602.jar包放入商户应用工程的libs目录下,以下图。
2.进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-20150602.jar导入,以下图。
3.选中Order and Export,勾选alipaySDK-20150602.jar,以下图。
将上图的支付宝sdk更换成微信sdk便可
1.将微信SDK拷贝到项目libs文件夹下,若是没有libs文件夹,就新建一个。
2.若是sdk使用过程当中,提示找不到文件。 进行以下操做,选中sdk文件,右击选择Reveal in Finder
1.在商户应用工程的AndroidManifest.xml文件里面添加声明:
<!--微信-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
</activity>
复制代码
和权限声明:
<!--微信-->
<uses-permission android:name="android.permission.INTERNET"/>
复制代码
到这里,微信支付的前期配置已经完成,下面须要完成支付代码编写。
// 微信按钮
public void onClick(View view) {
//起一个线程
Runnable payRunnable = new Runnable() {
@Override
public void run() {
String data = null;
PayBean payBean = new PayBean();
payBean.setOrderTime("");
String json = new Gson().toJson(payBean);
//json为获取后端结果时须要提供给后端订单信息,例如:时间、金额、订单属性等
Log.i("charge request", json);
try {
//data为后端返回数据,其中包括订单字符串
data = postJson(CHARGE_URL, json);
} catch (IOException e) {
e.printStackTrace();
}
// Json解析data
ChargeWXBean charge = new Gson().fromJson(data.replace("package", "packages"), ChargeWXBean.class);
//在mHandler中处理微信调起支付和返回结果回调
Message msg = new Message();
msg.what = SDK_PAY_WECHAT;
msg.obj = charge;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
复制代码
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == SDK_PAY_WECHAT) {
ChargeWXBean charge = (ChargeWXBean) msg.obj;
String packsges = charge.getResult().getCredential().getPackages();
String appid = charge.getResult().getCredential().getAppid();
String partenerid = charge.getResult().getCredential().getPartnerid();
String prepayid = charge.getResult().getCredential().getPrepayid();
String noncestr = charge.getResult().getCredential().getNoncestr();
String timestamp = charge.getResult().getCredential().getTimestamp();
String sign = charge.getResult().getCredential().getSign();
// 商户APP工程中引入微信JAR包,调用API前,须要先向微信注册您的APPID,代码以下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(ThirdActivity.this, null);
// 将该app注册到微信
msgApi.registerApp(appid);
PayReq req = new PayReq();
req.appId = appid;
req.partnerId = partenerid;
req.prepayId = prepayid;
req.nonceStr = noncestr;
req.timeStamp = timestamp;
req.packageValue = packsges;
req.sign = sign;
msgApi.sendReq(req);
}
}
};
复制代码
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会形成没法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者须要在该函数中接收通知,判断返回错误码,若是支付成功则去后台查询支付结果再展现用户实际支付结果。注意必定不能以客户端返回做为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。(net.sourceforge.simcpux为你的项目包名)代码示例以下:
@Override
public void onResp(BaseResp resp) {
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
// 判断resultStatus 为“0”则表明支付成功,具体状态码表明含义可参考接口文档
if (resp.errCode.equals("0")) {
Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
}else if (resp.errCode.equals("-1")){
// -1为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(ThirdActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}else if (resp.errCode.equals("-2")){
// -2为取消支付,或者系统返回的错误
Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
}else {
// 其余为系统返回的错误
Toast.makeText(ThirdActivity.this, "支付错误", Toast.LENGTH_SHORT).show();
}
}
复制代码
如下三种为经常使用结果判断
0为支付成功 -1为支付失败 -2为取消支付
关注 【网罗开发】微信公众号,网罗天下方法,方便你我开发,更多Android技术干货等待领取,全部文档会持续更新,欢迎关注一块儿成长!
但愿能够帮助你们
若是哪里有什么不对或者不足的地方,还望读者多多提意见或建议
如需转载请联系我,通过受权方可转载,谢谢