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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

学了支付宝支付之后,银联和微信支付的开发流程几乎是一样的。
1.     银联支付流程图
2.     到银联开发者平台下载开发包
3.     安装“UPPayDemo.apk”,安装后运行效果如下:
4.     打开“中国银联手机支付控件接入指南Android.doc”,在这个文档中有测试账号(账号:6226090000000048,验证码:123456),使用测试账号进行测试,结果如下:

“UPPayDemo.apk”对应的源码也在开发包中,这个Demo可以完全支付了说明现在的Demo就已经完全配置好了银联的开发环境了,我们只需要参照这个Demo去配置我们自己的项目即可。
注:银联开发环境的编译不能在太老的环境下编译,否则会报类找不到异常
5.     创建一个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="unionPay" />

  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 unionPay(View v) {
  9.                
  10.         }

  11. }

复制代码
6.     配置银联开发环境:
       a)     按照前面运行的apk的提示把相应的资源复制到相应的目录下
       b)     导入银联Demo,把银联Demo中的清单文件中的权限复制到我们的项目中
       c)     把银联Demo中的清单文件中声明的支付相关的Activity声明复制到我们的项目中
7.     根据运行的apk提示,调用UPPayAssistEx.startPay()方法进行支付,这个方法中的各位参数是干嘛用的呢?在银联Demo中搜索“startPay”查看即可,参考APKActivity,代码如下:
  1. public class MainActivity extends Activity {

  2.     public static final int PLUGIN_VALID = 0;
  3.     public static final int PLUGIN_NOT_INSTALLED = -1;
  4.     public static final int PLUGIN_NEED_UPGRADE = 2;
  5.         private static final String LOG_TAG = "MainActivity";

  6.         @Override
  7.         protected void onCreate(Bundle savedInstanceState) {
  8.                 super.onCreate(savedInstanceState);
  9.                 setContentView(R.layout.activity_main);
  10.         }
  11.         
  12.         public void unionPay(View v) {
  13.                 String tn = "";
  14.                 unionPay(tn);
  15.         }

  16.         private void unionPay(String tn) {
  17.                 // mMode参数解释:
  18.                 // 0 - 启动银联正式环境
  19.                 // 1 - 连接银联测试环境
  20.                 String mode = "1";
  21.                 int ret = UPPayAssistEx.startPay(this, null, null, tn, mode);
  22.                 if (ret == PLUGIN_NEED_UPGRADE || ret == PLUGIN_NOT_INSTALLED) {
  23.                         // 需要重新安装控件
  24.                         Log.e(LOG_TAG, " plugin not found or need upgrade!!!");

  25.                         AlertDialog.Builder builder = new AlertDialog.Builder(this);
  26.                         builder.setTitle("提示");
  27.                         builder.setMessage("完成购买需要安装银联支付控件,是否安装?");
  28.                         builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
  29.                                 @Override
  30.                                 public void onClick(DialogInterface dialog, int which) {
  31.                                         UPPayAssistEx.installUPPayPlugin(MainActivity.this);
  32.                                         dialog.dismiss();
  33.                                 }
  34.                         });

  35.                         builder.setPositiveButton("取消", new DialogInterface.OnClickListener() {

  36.                                 @Override
  37.                                 public void onClick(DialogInterface dialog, int which) {
  38.                                         dialog.dismiss();
  39.                                 }
  40.                         });
  41.                         builder.create().show();
  42.                 }
  43.         }

  44. }
复制代码
8.     上一步需要一个tn参数,这个tn参数为交易流水号,这个值如何获取,也可参照银联Demo中的BaseActivity实现,代码如下:
  1. public void unionPay(View v) {
  2.         mLoadingDialog = ProgressDialog.show(this,  "", "正在努力的获取tn中,请稍候...", true);
  3.                 String url = "http://101.231.204.84:8091/sim/getacptn";  // 真实开发这里应该要把购物车中的数据提交到服务器,由服务器生成“支付串”,把”支付串“交给银联插件即可完成支付。
  4.                 Listener<String> listener = new Listener<String>() {

  5.                         @Override
  6.                         public void onResponse(String response) {
  7.                                 Log.i(LOG_TAG, "response = " + response);
  8.                                 String tn = response;
  9.                                 if (mLoadingDialog.isShowing()) {
  10.                             mLoadingDialog.dismiss();
  11.                         }

  12.                         if (tn == null || tn.length() == 0) {
  13.                             AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
  14.                             builder.setTitle("错误提示");
  15.                             builder.setMessage("网络连接失败,请重试!");
  16.                             builder.setNegativeButton("确定",
  17.                                     new DialogInterface.OnClickListener() {
  18.                                         @Override
  19.                                         public void onClick(DialogInterface dialog, int which) {
  20.                                             dialog.dismiss();
  21.                                         }
  22.                                     });
  23.                             builder.create().show();
  24.                         } else {
  25.                             /*************************************************
  26.                              * 步骤2:通过银联工具类启动支付插件
  27.                              ************************************************/
  28.                             unionPay(tn);
  29.                         }
  30.                         }
  31.                 };
  32.                 ErrorListener errorListener = new ErrorListener() {

  33.                         @Override
  34.                         public void onErrorResponse(VolleyError error) {
  35.                                 Log.i(LOG_TAG, "请求出错了", error);
  36.                         }
  37.                 };
  38.                 Request<String> request = new StringRequest(url, listener, errorListener);
  39.                 Volley.newRequestQueue(this).add(request);
  40.         }
复制代码
9.     验证结果,参照银联Demo中的BaseActivity实现,代码如下:
  1. @Override
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.         /*************************************************
  4.          * 步骤3:处理银联手机支付控件返回的支付结果
  5.          ************************************************/
  6.         if (data == null) {
  7.             return;
  8.         }

  9.         String msg = "";
  10.         /*
  11.          * 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
  12.          */
  13.         String str = data.getExtras().getString("pay_result");
  14.         if (str.equalsIgnoreCase("success")) {
  15.             // 支付成功后,extra中如果存在result_data,取出校验
  16.             // result_data结构见c)result_data参数说明
  17.             if (data.hasExtra("result_data")) {
  18.                 String result = data.getExtras().getString("result_data");
  19.                 try {
  20.                     JSONObject resultJson = new JSONObject(result);
  21.                     String sign = resultJson.getString("sign");
  22.                     String dataOrg = resultJson.getString("data");
  23.                     // 验签证书同后台验签证书
  24.                     // 此处的verify,商户需送去商户后台做验签
  25. //                    boolean ret = verify(dataOrg, sign, "1");
  26.                     boolean ret = true;
  27.                     if (ret) {
  28.                         // 验证通过后,显示支付结果
  29.                         msg = "支付成功!";
  30.                     } else {
  31.                         // 验证不通过后的处理
  32.                         // 建议通过商户后台查询支付结果
  33.                         msg = "支付失败!";
  34.                     }
  35.                 } catch (JSONException e) {
  36.                 }
  37.             } else {
  38.                 // 未收到签名信息
  39.                 // 建议通过商户后台查询支付结果
  40.                 msg = "支付成功!";
  41.             }
  42.         } else if (str.equalsIgnoreCase("fail")) {
  43.             msg = "支付失败!";
  44.         } else if (str.equalsIgnoreCase("cancel")) {
  45.             msg = "用户取消了支付";
  46.         }

  47.         AlertDialog.Builder builder = new AlertDialog.Builder(this);
  48.         builder.setTitle("支付结果通知");
  49.         builder.setMessage(msg);
  50.         builder.setInverseBackgroundForced(true);
  51.         // builder.setCustomTitle();
  52.         builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
  53.             @Override
  54.             public void onClick(DialogInterface dialog, int which) {
  55.                 dialog.dismiss();
  56.             }
  57.         });
  58.         builder.create().show();
  59.     }
复制代码
这里拿到的支付结果也是银联同步返回的结果,真实开发的话app还要再给自己的服务器发送一个查询支付结果的请求,以服务器的支付结果为准。

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

01_支付宝支付:http://bbs.itheima.com/thread-305148-1-1.html
03_微信支付:http://bbs.itheima.com/thread-305151-1-1.html

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马