android:讲述一下我的第三方支付之路(微信和支付宝)
先讲述繁琐版本:因为一开始我并不是很了解支付这一块也是第一次去做,所以开始聊聊我的踩坑道路
支付宝还是很好理解的
首先是导入包/库,复制一些代码:
比如说以上这些,其次是manifest页面
必须要写的一些权限
<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" />
还有就是支付宝要求的activity
<!--支付宝--> <activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name="com.alipay.sdk.app.H5AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity>
以上两个activity最好不要有任何的改动,因为这关乎到你手机没有支付宝的情况下,他能通过走H5页面来支付。
还有就是打包混淆这个不用多说,只是练习的话不需要
-keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.alipay.sdk.app.H5PayCallback { <fields>; <methods>; } -keep class com.alipay.android.phone.mrpc.core.** { *; } -keep class com.alipay.apmobilesecuritysdk.** { *; } -keep class com.alipay.mobile.framework.service.annotation.** { *; } -keep class com.alipay.mobilesecuritysdk.face.** { *; } -keep class com.alipay.tscenter.biz.rpc.** { *; } -keep class org.json.alipay.** { *; } -keep class com.alipay.tscenter.** { *; } -keep class com.ta.utdid2.** { *;} -keep class com.ut.device.** { *;}
我关于支付踩的第一个坑就是上边两个activity,剩下的支付宝就不会出现问题了,不说了直接上代码。
调起支付:
这个ordderinfo=app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。也就是sign,一般是由后台生成,想自己生成,可以去下载支付宝源码看一下他的方式,传送门:https://docs.open.alipay.com/54/104509
final String orderInfo = info; // 订单信息 Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(DemoActivity.this); String result = alipay.payV2(orderInfo,true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start();
返回结果:
private Handler mHandler = new Handler() { public void handleMessage(Message msg) { Result result = new Result((String) msg.obj); Toast.makeText(DemoActivity.this, result.getResult(), Toast.LENGTH_LONG).show(); }; };
以上就是支付宝的过程 很简单吧只有一个坑而已,就是manifest界面的两个activity一个都不能少,也不能动;
微信的打地鼠过程
微信最大的一个坑就是应用签名这一块
这个是要通过传送门:下载应用签名工具。
然后安装到手机上输入包名,再在这个网页设置一下应用签名就成了,应用签名和包名一定要对应一致,不然你的支付只能发起一次,就再也发起不了了。
和支付宝的顺序一样先导包/库和代码,权限和支付宝差不太多,第二个坑来了。
wxapi这个包必须放置在你的包名下,不能放置到别的包里也不能从新建立,名字都不能改;
原因貌似是微信是有一个异步回调的,好像是你如果放到别的地方,就返回不了结果了。
就是上图的那个onReq和onResp方法 嘿嘿...也可以在这里写你的结果
下一步注册Appid在网页上注册好了,拿回来放到你要支付的页面里
//微信注册在APP内
api = WXAPIFactory.createWXAPI(PayActivity.this,null);
api.registerApp(APP_ID);
之后就是调起支付了
微信端需要的参数很多,不同于支付宝只有一条参数。
req=new PayReq(); req.appId=wx.getAppid(); req.sign=wx.getSign(); req.nonceStr=wx.getNonce_str(); req.packageValue=wx.getPackageX(); req.timeStamp=wx.getTime_stamp(); req.prepayId=wx.getPrepay_id(); req.partnerId=wx.getMch_id(); api.sendReq(req);
然后就要用到我说的获取结果参数了
@Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp resp) { L.d("TAG","errCode-------"+resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { Intent intent=new Intent(WXPayEntryActivity.this,PayResultActivity.class); intent.putExtra("WXResult",""+resp.errCode); startActivity(intent); finish(); } }
这样微信也就完成了
其实现在回想起来坑就少了,刚开始写的时候这个不懂那个不懂就很麻烦;
现在开始说简易版也就是咱们真正要用到的
因为是简易版就是先走一下逻辑:
1.生成订单编号----把后台需要的参数发给他拿到订单编号--------------------------2.选择微信/支付宝,然后用订单编号拿到微信/支付宝所需参数-----------------------3.用2的参数发起支付-------------4.支付完毕,返回---利用订单号查询结果。
总体逻辑就是一切需要参数和算法的东西你都不需要过手,你就只需要会发起支付就成了。
以上就是微信和支付宝支付的核心,这也是我自己的笔记。嘿嘿