支付模块其实很早就做完了的,只是当初说需要银联支付,打算一起做完再写的,结果现在说银联支付不做了,好咯现在也没谁用银联支付这个坑爹的东西了·····
另外还有就是懒癌发作了所以拖到现在,不说废话了。(写完再说)
说明下,本文讲的是在后台生成支付密钥的情况下使用,实际上一般也不允许你自己生成的。
官方文档地址,其实官方文档讲的挺清楚了,我记录下简化版而已
支付宝开放平台
首先添加依赖·······(废话来的)
compile files('libs/alipaySdk-20161009.jar')
然后就可以用了······
因为我没有加入网页支付,也就是说手机上必须装有支付宝才能使用,这是最最简单的方法
//支付宝回调
private final int SDK_PAY_FLAG = 1;
* call alipay sdk pay. 调用SDK支付
*/
public void alipay(final String payInfo) { //这里的payInfo是后台返回的,前端不用关心,用就是了,错了是后台的问题
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayPhotoActivity.this);
Map<String, String> result = alipay.payV2(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
上面是使用的,接着是回调
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
//这里是支付成功,做后续操作
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
showToast("支付失败");
}
break;
}
default:
break;
}
}
};
好了支付宝的支付就是这么简单,简单到没人性······(曾经我以为不容易来着)
接下来是微信支付,这个略坑
微信支付文档
导包,吐槽下这个名字······
compile files('libs/libammsdk.jar')
然后建在工程里新建一个类,外面的包名给类名要一毛一样
![这样的]UU.png](http://upload-images.jianshu.io/upload_images/3412698-8779d8da66d421fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这个类里面是这样子的
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
private PayLongActivity payLongActivity ;
// APP_ID 替换为你的应用从官方网站申请到的合法appId
public static final String APP_ID = "11111111111111";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, APP_ID);
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) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode==1) {
sendBroadcast(new Intent(ConstantsConfig.ReceiverConfig.WX_PAY_SUCCESS));//成功广播
}
else sendBroadcast(new Intent(ConstantsConfig.ReceiverConfig.WX_PAY_FAIL));//失败广播
finish();
}
}
没什么用的我都删了,当然是对我来说没什么用
这里吐槽下微信支付回调要另外弹出这个Activity,来告诉你成功还是失败,简直影响体验······
所以我修改成用广播通知,这个界面直接finish掉。
其实按照我的习惯用RxBus最好最方便了,之前有写过的,这个项目不允许就算了,后续回调你们自己看着来吧。
好,我们继续,这里是回调,接下来讲使用:
同样支付的数据都要从后台拿,微信的数据也是还要自己解析···我直接把json传进来了,
反正你只要把req里面的这几个参数赋值对了就行,怎么传过来都好
private void wxpay(JSONObject json) throws JSONException {
IWXAPI wxapi = WXAPIFactory.createWXAPI(this, null);
//这个跟回调那里一样要拿到后台申请的那个ID
wxapi.registerApp("11111111111");
if (null != json && !json.has("retcode")) {
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
req.appId = json.getString("appId");
req.partnerId = json.getString("partnerId");
req.prepayId = json.getString("prepayId");
req.nonceStr = json.getString("nonceStr");
req.timeStamp = json.getString("timeStamp");
req.packageValue = json.getString("packageValue");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
// Toast.makeText(PayPhotoActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
wxapi.sendReq(req);
} else {
// Toast.makeText(PayPhotoActivity.this, "返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
}
好,微信代码里面的就到这里,这还不算坑,还过的去
问题出在要配置后台····
包名好说,复制粘贴就好
说的是应用签名
AS里面获取MD5的方法 http://jingyan.baidu.com/article/cbf0e500aca3232eaa289301.html
拿到后应该是这样的 81:6F:96:F7:2F:AE:7D:04:D4:73:F9:C5:EB:1C:4C:83
我们要吧冒号全部去掉,然后字母全部变成小写
去掉冒号一个txt自行解决
816F96F72FAE7D04D473F9C5EB1C4C83
然后我是用AS的快捷键 ctrl+shift+U 搞定的,你们有好的方法也行·······
816f96f72fae7d04d473f9c5eb1c4c83
好了这个就是填上去的应用签名了
注意这只是编译版本的
打包后你要重新配置,签名就是拿签名文件keystore里面的,获取方法嘛
cmd里面用这个代码 ***.keystore 为文件路径
keytool -v -list -keystore ***.keystore
这坑爹的东西没有配置对的话,第一次调用微信支付是可以的,然后第二次就不行了,
那时死命找原因才发现是这个地方的问题,话说这个也要我们弄也是坑······
好了支付宝支付和微信支付的就这么点东西,其实并不难······
接着,我想重新找家公司了,有人愿意要我或者帮忙内推下的么,有愿意帮忙的私信下我呗,万分感谢~
最后来句迟来的