android集成支付宝sdk|Java开发|码途山海.智隐长卷 -

程序人生|重庆纽新

找回密码
立即注册

QQ登录

只需一步,快速开始

欢迎访问【程序人生-重庆纽新】,本网站为软件开发人员视觉的IT资讯、软件开发中各种问题的解决办法!!
搜索
发新帖


2308

积分

0

好友

259

主题
楼主
发表于 2016-5-30 22:34:56 | 查看: 1747| 回复: 1
因为由于公司项目接触到了集成支付宝,所以也就简单讲解一下android如何集成支付宝,这个没有大家想像 难 ,甚至可以说简单不可在简单了.
为什么呢?看到最后会知道了

第一步:运行demo
先获取支付宝的测试帐号,想必看到这个文章时大家也都已经有支付宝的测试帐号了,也是就公钥,私钥之类的 ,没有的话移步
https://open.alipay.com/platform/home.htm
下载sdk
https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
好了现在准备工作已经做好.
运行demo直接把生成的公钥私钥填上,
即可运行 这个没什么问题的


第二部:集成项目
现在呢,我们看一下支付宝的 skd demo


好 也就这几个文件,其中
Base64.java
PayResult.java
SignUtils.java
直接放入项目即可
我们只需要对
PayDemoAvtivity.java做修改即可
至于,另外两个个人认为用不到直接Delete.

在AndroidManifest.xml
加入相应权限




复制代码
如果手机中没有安装支付宝APP怎么办?
支付宝sdk已经做好了处理,会自己跳转到H5的支付宝支付,我们也需要加相应权限
  1. <activity
  2. android:name="com.alipay.sdk.app.H5PayActivity"
  3. android:configChanges="orientation|keyboardHidden|navigation|screenSize"
  4. android:exported="false"
  5. android:screenOrientation="behind"
  6. android:windowSoftInputMode="adjustResize|stateHidden" >
复制代码
根据com.alipay.sdk.app.H5PayActivity
路径可以看出这个是SDK内部activity.一定要加上不然,如果手机没装支付宝APP,程序就会挂掉了.

在PayDemoActivity.java
可以看出 主要是就是pay这个方法
核心是
  1. Runnable payRunnable = new Runnable() {

  2.                         @Override
  3.                         public void run() {
  4.                                 // 构造PayTask 对象
  5.                                 PayTask alipay = new PayTask(PayDemoActivity.this);
  6.                                 // 调用支付接口,获取支付结果
  7.                                 String result = alipay.pay(payInfo, true);

  8.                                 Message msg = new Message();
  9.                                 msg.what = SDK_PAY_FLAG;
  10.                                 msg.obj = result;
  11.                                 mHandler.sendMessage(msg);
  12.                         }
  13.                 };

  14.                 // 必须异步调用
  15.                 Thread payThread = new Thread(payRunnable);
  16.                 payThread.start();
复制代码

追根到底就是sendMessage -- payInfo到支付宝,
那么payInfo就显得尤为重要了.

payInfo里面是什么呢 ? 就是订单信息了
打印一下看看.
  1. partner="2088101568353491"&
  2. seller_id="alipay-test07@alipay.com"&
  3. out_trade_no="051111312119552"&
  4. subject="测试的商品"&
  5. body="该测试商品的详细描述"&
  6. total_fee="0.01"&
  7. notify_url="http://notify.msp.hk/notify.htm"&
  8. service="mobile.securitypay.pay"&
  9. payment_type="1"&
  10. _input_charset="utf-8"&
  11. it_b_pay="30m"&
  12. return_url="m.alipay.com"&
  13. sign="mX93Jy8zE92ZupO827CWCPGzK%2F1zB4x6TgTPzM%2FoCiuh04n1cdW0mxEC2yF7pPgt01lv81BTYweViJl7VM1SfJytQJXMOzBDARb9Zw2WKrq3h3neVXi8C1%2Bey2GJJvUWSMfiTv71Gd4APPPRRBD7XtwssqJahBoat%2FOC2H6eWCw%3D"&
  14. sign_type="RSA"
复制代码
就是一些订单的信息,配置加一个由私钥生成的一个签名

我们真正需要的就是这个payInfo,我们生成一个 payInfo发送给支付宝就 ok了.
文章开始,我就说了 集成支付宝简单不能在简单了 ,,为什么呢?下面告诉你,

因为出入安全的考虑,支付宝不建议公钥私钥暴露在客户端代码中,这些最好在服务端生成send客户端

也就是说这些逻辑完全不用android来做.是不是很轻松 .
所以我的个人建议是 payInfo尽量在服务器获取后使用上面代码发送支付宝.

在PayDemoActivity.java中还有一个重要方法
  1. @SuppressLint("HandlerLeak")
  2.         private Handler mHandler = new Handler() {
  3.                 @SuppressWarnings("unused")
  4.                 public void handleMessage(Message msg) {
  5.                         switch (msg.what) {
  6.                         case SDK_PAY_FLAG: {
  7.                                 PayResult payResult = new PayResult((String) msg.obj);
  8.                                 /**
  9.                                  * 同步返回的结果必须放置到服务端进行验证(验证的规则请看[url]https://doc.open.alipay.com/doc2/[/url]
  10.                                  * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
  11.                                  * docType=1) 建议商户依赖异步通知
  12.                                  */
  13.                                 String resultInfo = payResult.getResult();// 同步返回需要验证的信息

  14.                                 String resultStatus = payResult.getResultStatus();
  15.                                 // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
  16.                                 if (TextUtils.equals(resultStatus, "9000")) {
  17.                                         Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
  18.                                 } else {
  19.                                         // 判断resultStatus 为非"9000"则代表可能支付失败
  20.                                         // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
  21.                                         if (TextUtils.equals(resultStatus, "8000")) {
  22.                                                 Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

  23.                                         } else {
  24.                                                 // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
  25.                                                 Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

  26.                                         }
  27.                                 }
  28.                                 break;
  29.                         }
  30.                         default:
  31.                                 break;
  32.                         }
  33.                 };
  34.         };
复制代码
验证的逻辑,,因为我们的逻辑基本都在服务端,订单被篡改几率较小,验证相对也可以不写(个人认为,如有错误请指出).

当前方法提供了支付完成后的方法.写自己逻辑就行.

所以我们在PayDemoActivity.java保留上述两个方法其他都可以delete.

</activity

收藏回复 只看该作者 道具 举报

高级模式
B Color Image Link Quote Code Smilies



QQ|小黑屋| 码途山海.智隐长卷 渝ICP备15002301号-2   渝公网安备50011202504426

GMT+8, 2025-5-18 02:24 , Processed in 0.047517 second(s), 29 queries .

©Copyright 程序人生!

©2012-2015重庆纽新

快速回复 返回顶部 返回列表