A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2016-5-27 17:12  /  2385 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2016-5-27 17:54 编辑

移动支付
移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能.远程支付(网上支付,短信支付),近场支付(刷卡,滴卡,pos机)
移动支付方式:
*  支付宝
*  微信
*  银联
*  百度钱包
*  QQ钱包
*  财付通
*  京东支付
*  易宝支付
*  快钱支付
      我们这里要学习的是支付宝支付、微信支付和银联支付。

支付流程
1、浏览商品,如下:
      
2、把商品加入购物车,如下:
     
3、把购物车中的商品拿到收银台结账 ,如下:
     

上面3张图是现实生活中的支付流程,步骤细化后如下:
1.    浏览商品
2.    把要买的商品加入购物车
3.    把商品拿到收银台,收银人员处理商品信息
4.    告诉收银员支付方式
5.    选择支付方式进行支付
6.    处理支付结果(成功、失败、取消)

程序中的支付流程中:
1.    浏览商品
2.    把要买的商品加入购物车
3.    把购物车中的商品信息和用户信息和支付方式等信息发送到自己服务器,服务器处理商品信息生成订单,并返回”支付串”给客户端
4.    客户端拿着“支付串”,调用第三方服务(支付宝、微信、银联等)完成支付
5.    处理支付结果(成功、失败、取消)
*  同步返回:支付后通知我们自己的apk
*  异步通知:支付后通知我们的server

支付宝支付
1.    支付宝支付流程
      
2.    到支付宝放平台下载开发包
3.    导入支付宝Demo,并运行,提示如下:

这需要公司去申请支付宝商家账号,申请成功后即可获得partnerId(合作者id),这个直接问公司要就行了。
4.    密钥的获取,参照支付宝开发包中的openssl目录下“生成命令.txt”生成,生成我们自己的公钥和私钥,把我们的公钥提交到支付宝,支付宝再给我们返回支付宝的公钥。这一步需要先有支付宝商家账号,一般来说大家去了公司直接问公司领导要就行了。
5.    在Demo中的PayDemoActivity中配置好支付宝商家账号与各种密钥,如下:

         由于这些比较隐私,所以这里就没有把账号密钥贴出来。
把这几个都配置好之后运行Demo即可完成支付。效果如下:


  
Demo可以完全支付了说明现在的Demo就已经完全配置好了支付宝的开发环境了,我们只需要参照这个Demo去配置我们自己的项目即可。
6.    创建一个Android项目,界面如下:

activity_main.xml如下
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent" >

  4.     <Button
  5.         android:layout_width="wrap_content"
  6.         android:layout_height="wrap_content"
  7.         android:text="支付宝支付"
  8.         android:onClick="alipay" />

  9. </RelativeLayout>
复制代码
MainActivity.java如下:
  1. public class MainActivity extends Activity {

  2.         @Override
  3.         protected void onCreate(Bundle savedInstanceState) {
  4.                 super.onCreate(savedInstanceState);
  5.                 setContentView(R.layout.activity_main);
  6.         }
  7.         
  8.         public void alipay(View v) {
  9.                
  10.         }

  11. }
复制代码
7.    配置支付宝开发环境:
     a)    把支付宝Demo中的“alipaySdk-20160516.jar”复制到我们的项目中
     b)    把支付宝Demo中的清单文件中的权限复制到我们的项目中
     c)    把支付宝Demo中的清单文件中声明的支付相关的Activity声明复制到我们的项目中
8.    查看支付宝Demo中的支付方法,用到我们的Demo中,如下:      
  1.         public Handler mHandler = new Handler() {
  2.                 public void handleMessage(Message msg) {
  3.                         String result = (String) msg.obj;
  4.                         System.out.println(result);
  5.                 };
  6.         };
  7.         
  8.         public void alipay(View v) {
  9.                 String payInfo = null;
  10.                 payByAlipay(payInfo);
  11.         }

  12.         private void payByAlipay(final String payInfo) {
  13.                 Runnable payRunnable = new Runnable() {

  14.                         @Override
  15.                         public void run() {
  16.                                 // 构造PayTask 对象
  17.                                 PayTask alipay = new PayTask(MainActivity.this);
  18.                                 // 调用支付接口,获取支付结果
  19.                                 String result = alipay.pay(payInfo, true);

  20.                                 Message msg = new Message();
  21.                                 msg.obj = result;
  22.                                 mHandler.sendMessage(msg);
  23.                         }
  24.                 };

  25.                 // 必须异步调用
  26.                 Thread payThread = new Thread(payRunnable);
  27.                 payThread.start();
  28.         }
复制代码
9.    订单数据的生成和数据的签名都会放到服务器上来完成,这样安全性比较高,所以payInfo要从服务器中获取,这里使用Volley开源工具来发送网络请求,如下:  
  1. public void alipay(View v) {
  2.                 String url = "http://192.168.1.108:8080/AlipayPayDemoServer/submitOrder"; // 这个地址是我们自己写的服务器,生成支付串是由后台服务器完成的,Android客户端开发人员不需要知道它是怎么生成的,只需要发请求给服务器就行,具体需要哪些参数在真实开发中问服务器的开发人员即可。由于服务器中保存有账号、私钥等比较隐私的数据,所以这里就不把服务器发给大家了,等到以后我们公司申请了可以让广域网访问的服务器之后,再把地址发给大家,大家就改一下ip就行,这里的ip是电脑本机ip的地址,只能在我自己的电脑中管用。
  3.                 Listener<String> listener = new Listener<String>() {

  4.                         @Override
  5.                         public void onResponse(String response) {
  6.                                 System.out.println("response = " + response);
  7.                                 String payInfo = response;
  8.                                 payByAlipay(payInfo);
  9.                         }
  10.                 };
  11.                 ErrorListener errorListener = new ErrorListener() {

  12.                         @Override
  13.                         public void onErrorResponse(VolleyError error) {
  14.                                 Log.i("MainActivity", "请求出错了", error);
  15.                         }
  16.                 };
  17.                 Request<String> request = new StringRequest(Method.POST, url, listener, errorListener) {
  18.                         @Override
  19.                         protected Map<String, String> getParams() throws AuthFailureError {
  20.                                 Map<String, String> params = new HashMap<String, String>();
  21.                                 params.put("productName", "Iphone8");
  22.                                 params.put("productDesc", "好手机不多说");
  23.                                 params.put("productPrice", "0.01");
  24.                                 return params;
  25.                         }
  26.                 };
  27.                 Volley.newRequestQueue(this).add(request);
  28.         }
复制代码
10.  运行项目,完成支付。并查看打印的Log,从服务器获取的支付信息如下:
提交给支付宝支付插件进行支付的数据:
  1. partner="2088221626451032"&
  2. amp;seller_id="3393900637@qq.com"&out_trade_no="0525133339-1642"&
  3. amp;subject="Iphone8"&body="好手机不多说"&total_fee="0.01"
  4. ¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&return_url="m.alipay.com"&sign="crGQoAbmCuVa0GEIpH8GBZdHfXw%2BE5pUvoCcHlSJyUm9pZUcVpGLrQ3XHF4ZP8QL5uhntpeAjrBqsEAI18hvG8jOuiq6aYaxdpKkRX4DKAmLKmPbO0TiXVYLren%2BrNhwuBH8EvFQiXGfRCVXjxKBk9Z0YmgpeHExBZ%2Bhsgvr1tY%3D"&sign_type="RSA"
复制代码
这个数据里面包括商家收款账号、订单号、产品名称、产品价格、通知商家支付结果的后台地址、数据签名等等信息。

支付宝支付成功后返回给我们的支付结果数据:      
  1. resultStatus=
  2. {9000};memo={处理成功};result={partner="2088221626451032"&
  3. seller_id="3393900637@qq.com"&out_trade_no="0525133339-1642"&
  4. subject="Iphone8"&body="好手机不多说"&total_fee="0.01"
  5. ¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&return_url="m.alipay.com"&success="true"&sign_type="RSA"&sign="JVIrthJVAywrB1u1P77FKPwTJIIGcLpeQ3U3QNwUJMO2vXgUk1VfJBAhuYiUbu5Ewz5ZglFyB/1eSmOH4W1A3F3JDjmuA2aeQrO3AChFkz1LupeWn5L+g72ZsSjiHV3BSjg75TcaybEw0r3fRFQr8jrl2kcLugE5PvBqv4vsDHE="}
复制代码
11.  检查支付结果,上面的支付宝Demo的检查结果是使用了支付宝同步返回结果,真实开发应该要再去查询我们自己服务器的结果,以自己服务器的结果为准

资料下载地址:https://yunpan.cn/cSELK3jPijLpn  访问密码 edc7
注:支付宝支付使用的的合作者id密钥等保存到了服务器端,我们这里使用的是本地的服务器,由于隐私问题服务器不能发给大家,等后面申请了网络服务器之后会把网络地址告诉大家,这样大家就可以做支付宝支付的练习了。微信支付和银联支付是官网提供了测试账号和测试的服务器端,所以这两个大家可以直接写代码练习了。

02_银联支付:http://bbs.itheima.com/thread-305150-1-1.html
03_微信支付:http://bbs.itheima.com/thread-305151-1-1.html

1 个回复

倒序浏览
正好需要,谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马