登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

Android接入微信,支付宝支付 [复制链接]

2017-12-7 14:39
Torr 阅读:298 评论:1 赞:1
Tag:  

如今在各大手机应用市场中各种app层出不穷,使用范围也越来越广泛。然而其中最重要的功能就是支付功能了。因为开发app基本上就是涉及到盈利的情况。而现在的支付潮流莫过于微信和支付宝了。在开发过程中怎么接入实现微信和支付宝支付呢?其实微信和支付宝平台上都会有支付接入文档。所以按照惯例,首先的阅读一遍官方文档。随着官方文档的流程走,前台和后台相结合,实现自己app的支付流程。

Android接入微信,支付宝支付

微信支付

  • 前期准备

首先得现在微信开放平台官方去注册账号,创建应用并开通微信支付功能。后续到微信开放平台->资源中心->移动应用->微信支付功能这个路径下去按照 自己相应平台的文档流程接入。

微信开放平台地址:

https://open.weixin.qq.com/

微信官方的集成文档下载地址:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN

微信官方资源下载地址:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&lang=zh_CN

  • 支付接入并调用

  1. 首先得将下载的 libbammsdk.jar 放到 libs 文件夹下,将 WXPayEntryActivity 这个activity这个文件复制到相应的包下,WXPayEntryActivity 为微信支付回调的activity,一般的路劲就是你在开放平台注册时填的包名+wxapi包名下,该界面可以自定义界面,以便做支付回调的逻辑处理。一般按照官方的文档走,不要省略相应的步骤。

SDK下载地址:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

如图所示:

Android接入微信,支付宝支付

2. 其次是在 AndroidManifest.xml 文件中进行注册

<!-- 微信支付 --><activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>

3. 添加相关权限

<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_ST

4. 支付接口调用

/*** 微信支付* @param data接口返回*/private void weixinPay(String data) { // 通过WXAPIFactory工厂,获取IWXAPI的实例 IWXAPI api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID); // 将该app注册到微信 api.registerApp(WEIXIN_APP_ID); LogUtil.d("data=" + 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将应用注册到微信 api.sendReq(req); } catch (JSONException e) { e.printStackTrace(); } }

说明:为了安全,APP端调起支付的参数需要商户后台系统提供接口返回,请参考参数说明文档。

说明文档地址:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

  • 问题

以为这样就可以调起微信客户端支付了,没有想到一直返回支付结果为-1,没有多余的信息提示,不亏是微信,Android代码就是简洁!我们看到文档返回-1的提示“可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。我反复检查签名、APPID均没有错误,后台也确定sign信息正确,哎,我表示很无奈,iOS也调用了,他们提示”支付场景非法“,原来是由于后台之前做web支付,trade_type没有改成APP,改了我这边就能正常调起了。

如图所示:

Android接入微信,支付宝支付

支付宝支付

  • 前期准备

同微信支付一样,首先得现在蚂蚁金服开放平台官方去注册账号,创建应用并开通微信支付功能。后续到 蚂蚁金服开放平台->文档中心->移动支付 这个路径下去按照自己相应平台的文档流程接入。

蚂蚁金服开放平台地址:

https://open.alipay.com/platform/home.htm

  • 支付接入并调用

接入地址:

https://docs.open.alipay.com/59/103563

支付交互流程图:

Android接入微信,支付宝支付

  1. 首先你还是得先接入SDK,SDK下载完成后,将``alipaySdk-xxxxxxxx.jar``包放到libs文件夹下。

SDK下载地址:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Q5gnm8&treeId=193&articleId=104509&docType=1

2. 在 AndroidManifest.xml 中添加权限

<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" />

3. 在 AndroidManifest.xml 中注册SDK中需要的两个activity

<!-- 支付宝 alipay sdk begin --><activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity><activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity>

4. 支付接口调用

支付行为需要在独立的非ui线程中执行,代码如下:

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")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 Toast.makeText(mActivity, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(mActivity, payResult.getMemo(), Toast.LENGTH_SHORT).show(); } break; } default: break; } } ;};/** * 支付宝 */private void alipay(final String orderInfo) { Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(mActivity); Map<String, String> result = alipay.payV2(orderInfo, true); Log.i("msp", result.toString()); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; Thread payThread = new Thread(payRunnable); payThread.start();}


同样为了安全这里 orderInfo 是后台接口返回,参数说明文档。支付宝支付相对于微信支付还是很简单的。

说明文档地址:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.DwA283&treeId=59&articleId=103663&docType=1

  • 注意及问题

其中 orderString 内容,本身是一个字符串,这里将其换行分割一边观察了解和总结。

app_id=&timestamp=&biz_content=&method=alipay.trade.app.pay&charset=utf-8&version=1.0&sign_type=RSA2&sign=

如果出现 系统繁忙,请稍后再试(ALI40247) 等问题的解决办法是检查下 服务端使用 alipay.trade.app.pay 接口的私钥是不是和 APPID 应用下的公钥匹配,进行「秘钥匹配」工具。

工具地址:

https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1

总结

微信和支付宝支付如今已是出行必备的两个手机支付平台了,作为一个开发者掌握其基本的使用流程,熟悉其接入流程,避免出现影响用户使用的bug,这是最基本的。毕竟开发出一个产品最主要的还是盈利,如果用户在使用过程中出现支付相关的问题这将必然导致你们公司的盈利情况。

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(1)
柳湘翎 2017-12-11 15:09
11
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

返回顶部