吐槽一句微信的api真的是坑
参考文章:https://juejin.im/post/5833975961ff4b006c249067
支付宝支付
1. 合理的支付流程
导入sdk
- 从官网下载jar包放在libs文件夹下
alipaySdk-20170725.jar
- manifest.xml下添加权限
12345<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" />- manifest.xml下添加activity支付宝入口
123456789101112131415<!--支付宝activity,当没有安装支付宝时打开--><activityandroid:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity><activityandroid:name="com.alipay.sdk.app.H5AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity>- 从官网下载jar包放在libs文件夹下
发起支付
这里的订单(orderInfo)又服务端生成,我们负责调用支付宝app
12345678910111213141516171819202122232425/*** 支付宝支付 必须在异步线程** @param orderInfo app支付请求参数字符串,主要包含商户的订单信息,* key=value形式,以&连接,由服务端生成*/private void alipay(final String orderInfo) {Runnable payRunnable = new Runnable() {public void run() {PayTask alipay = new PayTask(MainActivity.this);//传入支付订单信息,设置ture表示显示支付的loadingMap<String, String> result = alipay.payV2(orderInfo, true);Message msg = new Message();msg.what = ALI_PAY_FLAG;msg.obj = result;handler.sendMessage(msg);}};Thread payThread = new Thread(payRunnable);payThread.start();}处理结果
这里处理的是支付宝支付的结果,完成支付后还应该请求服务器,同步服务器结果
12345678910111213141516171819202122232425262728293031323334353637383940414243444546private Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case ALI_PAY_FLAG: {//PayResult非常简单的工具类,把map里的结果取出来(来自支付宝demo)PayResult payResult = new PayResult((Map<String, String>) msg.obj);//对于支付结果,请商户依赖服务端的异步通知结果//同步通知结果,仅作为支付结束的通知String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();//状态码String memo = payResult.getMemo();//附加信息,如果不为空可以提示该内容switch (resultStatus) {case "9000"://支付成功break;case "8000"://支付结果确认中break;case "4000"://订单支付失败break;case "5000"://重复请求break;case "6001"://用户中途取消break;case "6002"://网络连接出错break;case "6004"://支付结果未知,请查询订单break;default://其它支付错误break;}Log.e("TAG", "handleMessage: " + payResult.toString());break;}default:break;}}};
微信支付
注意:微信支付需要签名和申请的时候填入的签名一直才能成功
ps:第一次调用可以成功,就算没有签名没有申请支付功能也能成功,应该是微信的小心思
导入sdk
- 从官网下载jar包放在libs文件夹下
libammsdk.jar
- manifest.xml下添加权限
123<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>- manifest.xml下添加activity微信支付入口
12345<!-- 微信支付 --><activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"/>- 从官方sdk中拷贝
WXPayEntryActivity
到项目中
拷贝的路径是
你的包名/wxapi/WXPayEntryActivity
,可以测试下是否能调起界面- 从官网下载jar包放在libs文件夹下
配置
WXPayEntryActivity
- onCreate
12345678910public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 去除界面直接跳转,也可以定义// setContentView();// 传入自己的appidapi = WXAPIFactory.createWXAPI(this, Constants.APP_ID);api.handleIntent(getIntent(), this);}- 重写
onResp()
根据成功失败做出相应操作
123456789101112131415161718public void onResp(BaseResp resp) {Log.e(TAG, "onPayFinish, errCode = " + resp.errCode);//判断状态if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {if (resp.errCode == 0) {Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();} else if (resp.errCode == -2) {Toast.makeText(this, "用户取消", Toast.LENGTH_SHORT).show();} else {//-1的状态Toast.makeText(this, "支付失败,请重试", Toast.LENGTH_SHORT).show();}}//记得关闭finish();}发起
请求
1234567891011121314151617181920212223242526272829/*** 微信支付** @param data 接口返回的订单信息,是一个json*/private void weixinPay(String data) {// 通过WXAPIFactory工厂,获取IWXAPI的实例,记得修改为自己的appidIWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);// 将该app注册到微信api.registerApp(Constants.APP_ID);Log.e("TAG", "weixinPay: " + data);try {JSONObject json = new JSONObject(data);PayReq req = new PayReq();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("package");req.sign = json.getString("sign");req.extData = "app data"; // optional// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信boolean b = api.sendReq(req);Log.e("TAG", "weixinPay: " + (b ? "true" : "false"));} catch (JSONException e) {e.printStackTrace();}}