zoukankan      html  css  js  c++  java
  • android应用程序如何调用支付宝接口

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

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

            不多说了,开写。

            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类吧。打开你会发现这个类很简单,如下所示:

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

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

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

        

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

           是不是,这个类很简单看懂吧,就一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 声明:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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

  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/5590644.html
Copyright © 2011-2022 走看看