最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多。

在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单。而且支付宝提供的接口一直在更新,可能支付宝那边是为了让接口更容易被调用吧,以前有些老的教程稍微跟现在接口有些不能“对号入座”,于是,我决定抽空写一篇关于调用支付宝接口的文章,跟大家分享,让大家以最快的速度掌握如何调用支付宝接口的方法。如果写的不好,请大家多多指教哦。

不多说了,开写。

1,到支付宝官网,下载支付宝集成开发包,看懂里面的关键代码

由于Android设备一般用的都是无线支付,所有我们申请的就是支付宝无线快捷支付接口。下面是申请的地址,下面还有下载接口开发包的地方

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654

如果链接失效,你可以到支付宝官网商家服务模块中找到 快捷支付(无线)这个服务。

下载集成开发包,解压发现里面有客户端的demo即说明文档,在客户端的demo中找到Android_SDK,这个就是你要用到的支付宝接口及demo。

把demo(alipay_sdk_demo)和(alipay_lib)导入到你的eclipse里面,然后你可以试着运行一遍demo(alipay_sdk_demo),只要把这个demo搞懂了,你就会调用这个支付宝接口了。至于到时候如何集成到你的项目里面,文档上说明很详细,按着文档上一步一步来就行了。我的建议是先把这个demo弄懂再设计你的项目,看看调用接口时需要哪些数据,这样也有利于你一开始设计数据。

下面来简单的介绍下接口demo里面的结构。

你打开项目会发现里面有5个类。

其中,Base64.Java、Result.java、Rsa.java这3个类不需要动,需要用到的,到时候直接放到你项目里面就行了,如果你想了解下它们你也可以看看。重点就是ExternalPartner.java和Keys.java这两个类。先来说说Keys.java类吧。打开你会发现这个类很简单,如下所示:

  1. package com.alipay.android.msp.demo;
  2. //
  3. // 请参考 Android平台安全支付服务(msp)应用开发接口(4.2 RSA算法签名)部分,并使用压缩包中的openssl RSA密钥生成工具,生成一套RSA公私钥。
  4. // 这里签名时,只需要使用生成的RSA私钥。
  5. // Note: 为安全起见,使用RSA私钥进行签名的操作过程,应该尽量放到商家服务器端去进行。
  6. public final class Keys {
  7. //合作身份者id,以2088开头的16位纯数字,这个你申请支付宝签约成功后就会看见
  8. public static final String DEFAULT_PARTNER = "";
  9. //这里填写收款支付宝账号,即你付款后到账的支付宝账号
  10. public static final String DEFAULT_SELLER = "";
  11. //商户私钥,自助生成,即rsa_private_key.pem中去掉首行,最后一行,空格和换行最后拼成一行的字符串,rsa_private_key.pem这个文件等你申请支付宝签约成功后,按照文档说明你会生成的.........................如果android版本太高,这里要用PKCS8格式用户私钥,不然调用不会成功的,那个格式你到时候会生成的,表急。
  12. public static final String PRIVATE = "";
  13. //支付宝(RSA)公钥  ,demo自带不用改,或者用签约支付宝账号登录ms.alipay.com后,在密钥管理页面获取;或者文档上也有。
  14. public static final String PUBLIC = "MIGfMA0GCSqGSIb3...................";
  15. }

Key.java这个类等你申请支付宝签约成功后再配置,先放在这不用管,如何配置我注释里面已经的很明白了。

然后是ExternalPartner.java这个类。这个类其实也很简单,你运行这个demo会发现就是一个listview里面加载的很多商品信息,点击一款商品就调用会支付宝接口(因为Key.java未配置,所以你现在估计调用不成功)。我们找到listview的点击事件的方法就找到调用支付宝的入口了,这个类的代码如下:

  1. package com.alipay.android.msp.demo;
  2. import java.io.IOException;
  3. ........
  4. ........
  5. import com.alipay.android.app.sdk.AliPay;
  6. public class ExternalPartner extends Activity implements OnItemClickListener,
  7. OnClickListener {
  8. public static final String TAG = "alipay-sdk";
  9. private static final int RQF_PAY = 1;
  10. private static final int RQF_LOGIN = 2;
  11. private EditText mUserId;
  12. private Button mLogon;
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.external_partner);
  17. initProducts();
  18. initListView();
  19. }
  20. /*
  21. * (non-Javadoc)
  22. *
  23. * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
  24. */
  25. @Override
  26. public boolean onCreateOptionsMenu(Menu menu) {
  27. menu.add(Menu.NONE, Menu.FIRST, 1, "快速登录");
  28. return true;
  29. }
  30. /*
  31. * (non-Javadoc)
  32. *
  33. * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
  34. */
  35. @Override
  36. public boolean onOptionsItemSelected(MenuItem item) {
  37. switch (item.getItemId()) {
  38. case Menu.FIRST:
  39. setContentView(R.layout.trustlogin);
  40. mUserId = (EditText) findViewById(R.id.user_id);
  41. mLogon = (Button) findViewById(R.id.get_token);
  42. mLogon.setOnClickListener(this);
  43. break;
  44. }
  45. return false;
  46. }
  47. private void initProducts() {
  48. if (sProducts != null)
  49. return;
  50. XmlResourceParser parser = getResources().getXml(R.xml.products);
  51. ArrayList<Product> products = new ArrayList<Product>();
  52. Product product = null;
  53. try {
  54. int eventType = parser.getEventType();
  55. while (eventType != XmlPullParser.END_DOCUMENT) {
  56. if (eventType == XmlPullParser.START_TAG
  57. && parser.getName().equalsIgnoreCase("product")) {
  58. product = new Product();
  59. product.subject = parser.getAttributeValue(0);
  60. product.body = parser.getAttributeValue(1);
  61. product.price = parser.getAttributeValue(2);
  62. products.add(product);
  63. }
  64. eventType = parser.next();
  65. }
  66. sProducts = new Product[products.size()];
  67. products.toArray(sProducts);
  68. } catch (XmlPullParserException e) {
  69. e.printStackTrace();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. //listview点击事件,里面调用的支付宝接口
  75. @Override
  76. public void onItemClick(AdapterView<?> arg0, View arg1, int position,
  77. long arg3) {
  78. try {
  79. Log.i("ExternalPartner", "onItemClick");
  80. String info = getNewOrderInfo(position);//这个是订单信息
  81. String sign = Rsa.sign(info, Keys.PRIVATE);//签名加密订单信息什么的
  82. sign = URLEncoder.encode(sign);
  83. info += "&sign=\"" + sign + "\"&" + getSignType();
  84. Log.i("ExternalPartner", "start pay");
  85. // start the pay.
  86. Log.i(TAG, "info = " + info);
  87. final String orderInfo = info;
  88. new Thread() {
  89. public void run() {
  90. AliPay alipay = new AliPay(ExternalPartner.this, mHandler);//这个应该就是支付宝接口了,哈哈,支付宝现在把很多功能都封装了,所以省了很多代码
  91. //设置为沙箱模式,不设置默认为线上环境
  92. //alipay.setSandBox(true);
  93. String result = alipay.pay(orderInfo);//这个是返回的结果,你到时候可以根据这个结果加以操作你想操作的,然后基本就完了,其他的你想附加的功能你看着写吧,现在Key.java配置好就能调用快捷支付了
  94. //后面的这些代码可以改成你自己的,也可以在它们的基础上改
  95. Log.i(TAG, "result = " + result);
  96. Message msg = new Message();
  97. msg.what = RQF_PAY;
  98. msg.obj = result;
  99. mHandler.sendMessage(msg);
  100. }
  101. }.start();
  102. } catch (Exception ex) {
  103. ex.printStackTrace();
  104. Toast.makeText(ExternalPartner.this, R.string.remote_call_failed,
  105. Toast.LENGTH_SHORT).show();
  106. }
  107. }
  108. //获得订单信息的方法
  109. private String getNewOrderInfo(int position) {
  110. StringBuilder sb = new StringBuilder();
  111. sb.append("partner=\"");
  112. sb.append(Keys.DEFAULT_PARTNER);// 合作身份者id
  113. sb.append("\"&out_trade_no=\"");
  114. sb.append(getOutTradeNo());//这个是订单编号
  115. sb.append("\"&subject=\"");
  116. sb.append(sProducts[position].subject);//这个应该是商品名称
  117. sb.append("\"&body=\"");
  118. sb.append(sProducts[position].body);//这个应该是商品的描述,具体你可以参考demo
  119. sb.append("\"&total_fee=\"");
  120. sb.append(sProducts[position].price.replace("一口价:", ""));//这个是要付款的金额,到时候你调用的时候改下就行了
  121. sb.append("\"¬ify_url=\"");
  122. // 网址需要做URL编码
  123. sb.append(URLEncoder.encode("http://notify.java.jpxx.org/index.jsp"));//服务器异步通知页面,完成交易后通知商家服务器的页面,以post的形式将商品订单信息发送到指定页面,手机客户端不需要可以先放在这不管
  124. sb.append("\"&service=\"mobile.securitypay.pay");
  125. sb.append("\"&_input_charset=\"UTF-8");
  126. sb.append("\"&return_url=\"");
  127. sb.append(URLEncoder.encode("http://m.alipay.com"));
  128. sb.append("\"&payment_type=\"1");
  129. sb.append("\"&seller_id=\"");
  130. sb.append(Keys.DEFAULT_SELLER);
  131. // 如果show_url值为空,可不传
  132. // sb.append("\"&show_url=\"");
  133. sb.append("\"&it_b_pay=\"1m");
  134. sb.append("\"");
  135. return new String(sb);
  136. }
  137. private String getOutTradeNo() {
  138. SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss");
  139. Date date = new Date();
  140. String key = format.format(date);
  141. java.util.Random r = new java.util.Random();
  142. key += r.nextInt();
  143. key = key.substring(0, 15);
  144. Log.d(TAG, "outTradeNo: " + key);
  145. return key;
  146. }
  147. private String getSignType() {
  148. return "sign_type=\"RSA\"";
  149. }
  150. private void initListView() {
  151. ListView lv = (ListView) findViewById(R.id.list_view);
  152. lv.setAdapter(new ExternalPartnerAdapter());
  153. lv.setOnItemClickListener(this);
  154. }
  155. private void doLogin() {
  156. final String orderInfo = getUserInfo();
  157. new Thread() {
  158. public void run() {
  159. String result = new AliPay(ExternalPartner.this, mHandler)
  160. .pay(orderInfo);
  161. Log.i(TAG, "result = " + result);
  162. Message msg = new Message();
  163. msg.what = RQF_LOGIN;
  164. msg.obj = result;
  165. mHandler.sendMessage(msg);
  166. }
  167. }.start();
  168. }
  169. private String getUserInfo() {
  170. String userId = mUserId.getText().toString();
  171. return trustLogin(Keys.DEFAULT_PARTNER, userId);
  172. }
  173. private String trustLogin(String partnerId, String appUserId) {
  174. StringBuilder sb = new StringBuilder();
  175. sb.append("app_name=\"mc\"&biz_type=\"trust_login\"&partner=\"");
  176. sb.append(partnerId);
  177. Log.d("TAG", "UserID = " + appUserId);
  178. if (!TextUtils.isEmpty(appUserId)) {
  179. appUserId = appUserId.replace("\"", "");
  180. sb.append("\"&app_id=\"");
  181. sb.append(appUserId);
  182. }
  183. sb.append("\"");
  184. String info = sb.toString();
  185. // 请求信息签名
  186. String sign = Rsa.sign(info, Keys.PRIVATE);
  187. try {
  188. sign = URLEncoder.encode(sign, "UTF-8");
  189. } catch (UnsupportedEncodingException e) {
  190. e.printStackTrace();
  191. }
  192. info += "&sign=\"" + sign + "\"&" + getSignType();
  193. return info;
  194. }
  195. @Override
  196. public void onClick(View v) {
  197. if (v instanceof Button) {
  198. switch (v.getId()) {
  199. case R.id.get_token:
  200. doLogin();
  201. break;
  202. }
  203. }
  204. }
  205. private class ExternalPartnerAdapter extends BaseAdapter {
  206. @Override
  207. public int getCount() {
  208. return sProducts.length;
  209. }
  210. @Override
  211. public Object getItem(int arg0) {
  212. return sProducts[arg0];
  213. }
  214. @Override
  215. public long getItemId(int position) {
  216. return position;
  217. }
  218. @Override
  219. public View getView(int position, View convertView, ViewGroup parent) {
  220. if (convertView == null) {
  221. LayoutInflater factory = LayoutInflater
  222. .from(ExternalPartner.this);
  223. convertView = factory.inflate(R.layout.product_item, null);
  224. }
  225. Product product = (Product) getItem(position);
  226. TextView tv = (TextView) convertView.findViewById(R.id.subject);
  227. tv.setText(product.subject);
  228. tv = (TextView) convertView.findViewById(R.id.body);
  229. tv.setText(product.body);
  230. tv = (TextView) convertView.findViewById(R.id.price);
  231. tv.setText(product.price);
  232. return convertView;
  233. }
  234. }
  235. Handler mHandler = new Handler() {
  236. public void handleMessage(android.os.Message msg) {
  237. Result result = new Result((String) msg.obj);
  238. switch (msg.what) {
  239. case RQF_PAY:
  240. case RQF_LOGIN: {
  241. Toast.makeText(ExternalPartner.this, result.getResult(),
  242. Toast.LENGTH_SHORT).show();
  243. }
  244. break;
  245. default:
  246. break;
  247. }
  248. };
  249. };
  250. public static class Product {
  251. public String subject;
  252. public String body;
  253. public String price;
  254. }
  255. public static Product[] sProducts;
  256. }

是不是,这个类很简单看懂吧,就一listview。调用支付宝接口的方法就在onItemClick()方法里面,如果你是一个按钮的话换成按钮点击事件就行了,主要的细节我注释已写。

现在你要想的是,需要哪些数据,提供给onItemClick()方法里面的 String info。demo里面的数据是getNewOrderInfo(int position)这个方法提供的,你可以自己提供或者在上面修改下。

现在,你已经知道代码是如何调用支付宝接口了。接下来,是如何把这些集成到你的项目中去。

  2,写好你的项目

 3,如何将支付宝接口集成到你的项目

1,将alipay.jar这个包复制至商户应用工程的libs 目录下,通过 Java Build Path导入进工程,文档说明上有

2,将 alipay_lib 拷贝到 Eclipse workspace,通过 Eclipse   import 该工程,并在此工程的 Properties->Android 中选中为 library 工程,文档上有图有真相

3,修改Manifest   ,在商户应用工程的 AndroidManifest.xml 文件里面添加 Activity 声明:

  1. <activity
  2. android:name="com.alipay.android.app.sdk.WapPayActivity"
  3. android:screenOrientation="portrait">
  4. </activity>
  5. 和权限声明:
  6. <uses-permission android:name="android.permission.INTERNET" />
  7. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  8. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  9. 至此,SDK 开发资源导入完成。

4,proguard配置
                      如果需要对代码进行混淆防止别人反编译的话可以配置,不需要的话这步可省略,文档上有配置方法。
         5,然后在你的项目里面新建一个包,名称可取com.xxx.alipay,直接把demo(alipay_sdk_demo)中的com.alipay.android.msp.demo包里面的类文件和demo里面的资源文件都直接复制过来,然后把ExternalPartner.java里面调用支付宝的核心代码提取到你项目里面要调用的地方,删除ExternalPartner.java就OK了。

4,向支付宝申请签约

进入我文章开头的那个地址,直接点申请就行了。

目的是为了或得PID与密钥,到时候你好按照文档配置你的Key.java文件。

申请要上传你的apk或者产品说明文档,我用的是产品说明文档,里面要包括产品说明(最好有产品截图,我第一次没截图直接没成功)、接口使用场景、资费说明。

申请成功后按文档上说明,做几个密钥什么的哈哈,上传你做的公钥。然后Key.java里面配置。这里要注意的是,String PRIVATE=“”;这里要用PKCS8格式的私钥。

配置成功即可测试啦!

好了,android集成支付宝接口我认为比较快的过程就是这些了,祝你配置成功!

   支付宝接口源码下载

 

转载请注明出处:http://blog.csdn.net/lilidejing/article/details/19483717

android应用程序如何调用支付宝接口的更多相关文章

  1. android应用程序如何调用支付宝接口(转)

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  2. Android 开发之Android 应用程序如何调用支付宝接口

    1.到支付宝官网,下载支付宝集成开发包 由于android设备一般用的都是无线支付,所以我们申请的就是支付宝无线快捷支付接口.下面是申请的地址以及下载接口开发包的网址:https://b.alipay ...

  3. Android之应用程序怎样调用支付宝接口

    http://blog.csdn.net/lilidejing/article/details/19483717 近期在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口.由于用的人比 ...

  4. 调用支付宝接口Android客户端没有支付宝APP的情况下解决无法调用支付宝页面的问题

    这几天一直研究支付宝接口调用,因为当前应用中需要调用支付宝接口作移动支付. 遇到一个问题困扰几天,就是当我们的手机端未安装支付宝APP的时候,需要在自己应用中调用支付宝的登陆网页进行支付.我是Andr ...

  5. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  6. Android应用程序如何调用shell脚本(一)

    转自: Android应用程序如何调用shell脚本(一) 一般来说, Android 下的应用程序可以“直接”得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限 ...

  7. Django 调用支付宝接口

    目录 一  支付宝接口 二  视图函数 支付宝支付 正式环境:用营业执照,申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appD ...

  8. jira webhook 事件触发并程序代码调用jenkins接口触发构建操作

    要解决的问题 开发管理工具触发站点构建事件,事件处理中需要调用Jenkins接口开始构建动作. 我的应用场景: 使用jira作为管理工具,在jira中创建自定义的工作流来规定测试,上线,发布等流程,并 ...

  9. 调用支付宝接口的简单demo

    依赖: <!-- alipay-sdk-java 注意一下版本--> <dependency> <groupId>com.alipay.sdk</groupI ...

随机推荐

  1. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  2. 简述memcached中的一致哈希

    memcached是一个开源的高性能分布式内存对象缓存系统. 其实思想还是比较简单的,实现包括server端(memcached开源项目一般只单指server端)和client端两部分: server ...

  3. RegisterDllAndOcx.bat -批量注册当前文件夹中的dll和ocx

    批量注册当前文件夹中的dll和ocx 新建文件:RegisterDllAndOcx.bat   @echo off echo hello,girl~~ for %%i in (*.dll *.ocx) ...

  4. codeforces 492B. Vanya and Lanterns 解题报告

    题目链接:http://codeforces.com/problemset/problem/492/B #include <cstdio> #include <cstdlib> ...

  5. WP8图片缩放功能实现

    最近在学习WP8,想实现WP微信中查看图片时的放大缩小功能. 网上找了两个解决方案: 1 利用GestureListener 这个类在Microsoft.Phone.Controls.Toolkit中 ...

  6. IIS配置默认文档

    我们在配置IIS的默认文档时是在这里配置的,如下图: 但是,有可能我们的根目录下没有这个文件,而且我们网站运行的时候也不想访问根目录下的这个文件,而是要访问其他文件夹下的某一个文件,比如网站运行的时候 ...

  7. Spetember 5th 2016 Week 37th Monday

    No matter how far you may fly, never forget where you come from. 无论你能飞多远,都别忘了你来自何方. Stay true to you ...

  8. chrome进入控制台时自动进入断点模式的解决方法

    简单粗暴,不知道为什么,去掉那个√就好了

  9. cuda 初学大全

    转自:http://blog.csdn.net/augusdi/article/details/12529331 cuda 初学大全 1 硬件架构CUDA编程中,习惯称CPU为Host,GPU为Dev ...

  10. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...