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

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

不多说了,开写。

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. ios滑动手势全屏(这段代码实现了下一级控制器滑到上一级控制器)

    在自定义导航控制器里面加以下代码就增加全屏滑动手势 >推向前一个控制器 //  HBNavigationController.m // #import "HBNavigationCon ...

  2. September 1st 2016 Week 36th Thursday

    Everything is going on, but don't give up trying. 万事随缘,但不要放弃努力. There are numerous things that we ca ...

  3. jvm学习

    一.jps主要用来输出JVM中运行的进程状态信息 jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器. Jps -ml 二.jstack主要用来查看某个Jav ...

  4. 51nod1006(lcs)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题意:中文题诶- 思路:最长公共子序列模板题- 我们用d ...

  5. Rotate partitions in DB2 on z

    Rotating partitions   You can use the ALTER TABLE statement to rotate any logical partition to becom ...

  6. Android Programming: Pushing the Limits -- Chapter 5: Android User Interface Operations

    多屏幕 自定义View 多屏幕 @.Android 4.2 开始支持多屏幕. @.举例: public class SecondDisplayDemo extends Activity { priva ...

  7. Asp.Net - 8.多线程

    8.1 概念 进程(Process):是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非利用分布式计算方式),一个 ...

  8. Delphi线程同步(临界区、互斥、信号量)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  9. 【JAVA网络流之TCP与UDP 】

    一.ServerSocket java.lang.Object |-java.net.ServerSocket 有子类SSLServerSocket. 此类实现服务器套接字.服务器套接字等待请求通过网 ...

  10. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...