zoukankan      html  css  js  c++  java
  • Android之应用程序怎样调用支付宝接口

    http://blog.csdn.net/lilidejing/article/details/19483717

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

              在网上搜索了下面,有非常多这方面的教程,但大部分教程过于陈旧,并且描写叙述的过于简单。并且支付宝提供的接口一直在更新,可能支付宝那边是为了让接口更easy被调用吧。曾经有些老的教程略微跟如今接口有些不能“对号入座”。于是。我决定抽出时间写一篇关于调用支付宝接口的文章,跟大家分享。让大家以最快的速度掌握怎样调用支付宝接口的方法。

    假设写的不好。请大家多多不吝赐教哦。

            不多说了。开写。

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

                    因为android设备一般用的都是无线支付,全部我们申请的就是支付宝无线快捷支付接口。以下是申请的地址,以下还有下载接口开发包的地方

                       https://b.alipay.com/order/productDetail.htm?

    productId=2013080604609654

     

    package com.alipay.android.msp.demo;  
    02.  
    03.//  
    04.// 请參考 Android平台安全支付服务(msp)应用开发接口(4.2 RSA算法签名)部分,并使用压缩包中的openssl RSA密钥生成工具。生成一套RSA公私钥。  
    05.// 这里签名时,仅仅须要使用生成的RSA私钥。  
    06.// Note: 为安全起见,使用RSA私钥进行签名的操作过程,应该尽量放到商家server端去进行。  
    07.public final class Keys {  
    08.  
    09.    //合作身份者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这个类。

    这个类事实上也非常easy,你执行这个demo会发现就是一个listview里面载入的非常多商品信息,点击一款商品就调用会支付宝接口(由于Key.java未配置,所以你如今预计调用不成功)。

    我们找到listview的点击事件的方法就找到调用支付宝的入口了。这个类的代码例如以下:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片 
    
    01.package com.alipay.android.msp.demo;  
    02.  
    03.import java.io.IOException;  
    04.........  
    05.........  
    06.import com.alipay.android.app.sdk.AliPay;  
    07.  
    08.public class ExternalPartner extends Activity implements OnItemClickListener,  
    09.        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"));//server异步通知页面,完毕交易后通知商家server的页面,以post的形式将商品订单信息发送到指定页面,手机client不须要能够先放在这无论  
    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.}  
    


      是不是。这个类非常easy看懂吧,就一listview。调用支付宝接口的方法就在onItemClick()方法里面,假设你是一个button的话换成button点击事件即可了。基本的细节我凝视已写。

            如今你要想的是,须要哪些数据,提供给onItemClick()方法里面的 String info。

    demo里面的数据是getNewOrderInfo(int position)这种方法提供的,你能够自己提供或者在上面改动下。

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

       2,写好你的项目

       3,怎样将支付宝接口集成到你的项目

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

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

              3,改动Manifest   ,在商户应用project的 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集成支付宝接口我觉得比較快的过程就是这些了。祝你配置成功!


     

     

  • 相关阅读:
    k8s Helm安装Prometheus Operator
    maven私有库神坑之:“Downloading: http://repo.maven.apache.org/maven2/”深坑!!!!!!坑害了一周时间
    docker java基础镜像
    helm安装EFK
    helm部署redis主从和哨兵模式
    k8s资源存储pv pvc 动态持久化存储StorageClass
    k8s service概述
    harbor镜像仓库原理和安装
    制作免费的https证书
    OpenStack点滴03-Neutron
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7232598.html
Copyright © 2011-2022 走看看