本帖最后由 戴振良 于 2016-5-27 17:55 编辑
学了支付宝支付之后,银联和微信支付的开发流程几乎是一样的。1. 银联支付流程图
3. 安装“UPPayDemo.apk”,安装后运行效果如下:
5. 创建一个Android项目,界面如下:
activity_main.xml如下
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="银联支付"
- android:onClick="unionPay" />
- </RelativeLayout>
复制代码 MainActivity.java如下: - public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-
- public void unionPay(View v) {
-
- }
- }
复制代码6. 配置银联开发环境: a) 按照前面运行的apk的提示把相应的资源复制到相应的目录下 b) 导入银联Demo,把银联Demo中的清单文件中的权限复制到我们的项目中 c) 把银联Demo中的清单文件中声明的支付相关的Activity声明复制到我们的项目中 7. 根据运行的apk提示,调用UPPayAssistEx.startPay()方法进行支付,这个方法中的各位参数是干嘛用的呢?在银联Demo中搜索“startPay”查看即可,参考APKActivity,代码如下:
- public class MainActivity extends Activity {
- public static final int PLUGIN_VALID = 0;
- public static final int PLUGIN_NOT_INSTALLED = -1;
- public static final int PLUGIN_NEED_UPGRADE = 2;
- private static final String LOG_TAG = "MainActivity";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-
- public void unionPay(View v) {
- String tn = "";
- unionPay(tn);
- }
- private void unionPay(String tn) {
- // mMode参数解释:
- // 0 - 启动银联正式环境
- // 1 - 连接银联测试环境
- String mode = "1";
- int ret = UPPayAssistEx.startPay(this, null, null, tn, mode);
- if (ret == PLUGIN_NEED_UPGRADE || ret == PLUGIN_NOT_INSTALLED) {
- // 需要重新安装控件
- Log.e(LOG_TAG, " plugin not found or need upgrade!!!");
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle("提示");
- builder.setMessage("完成购买需要安装银联支付控件,是否安装?");
- builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- UPPayAssistEx.installUPPayPlugin(MainActivity.this);
- dialog.dismiss();
- }
- });
- builder.setPositiveButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- });
- builder.create().show();
- }
- }
- }
复制代码8. 上一步需要一个tn参数,这个tn参数为交易流水号,这个值如何获取,也可参照银联Demo中的BaseActivity实现,代码如下: - public void unionPay(View v) {
- mLoadingDialog = ProgressDialog.show(this, "", "正在努力的获取tn中,请稍候...", true);
- String url = "http://101.231.204.84:8091/sim/getacptn"; // 真实开发这里应该要把购物车中的数据提交到服务器,由服务器生成“支付串”,把”支付串“交给银联插件即可完成支付。
- Listener<String> listener = new Listener<String>() {
- @Override
- public void onResponse(String response) {
- Log.i(LOG_TAG, "response = " + response);
- String tn = response;
- if (mLoadingDialog.isShowing()) {
- mLoadingDialog.dismiss();
- }
- if (tn == null || tn.length() == 0) {
- AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
- builder.setTitle("错误提示");
- builder.setMessage("网络连接失败,请重试!");
- builder.setNegativeButton("确定",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- });
- builder.create().show();
- } else {
- /*************************************************
- * 步骤2:通过银联工具类启动支付插件
- ************************************************/
- unionPay(tn);
- }
- }
- };
- ErrorListener errorListener = new ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.i(LOG_TAG, "请求出错了", error);
- }
- };
- Request<String> request = new StringRequest(url, listener, errorListener);
- Volley.newRequestQueue(this).add(request);
- }
复制代码9. 验证结果,参照银联Demo中的BaseActivity实现,代码如下: - @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- /*************************************************
- * 步骤3:处理银联手机支付控件返回的支付结果
- ************************************************/
- if (data == null) {
- return;
- }
- String msg = "";
- /*
- * 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
- */
- String str = data.getExtras().getString("pay_result");
- if (str.equalsIgnoreCase("success")) {
- // 支付成功后,extra中如果存在result_data,取出校验
- // result_data结构见c)result_data参数说明
- if (data.hasExtra("result_data")) {
- String result = data.getExtras().getString("result_data");
- try {
- JSONObject resultJson = new JSONObject(result);
- String sign = resultJson.getString("sign");
- String dataOrg = resultJson.getString("data");
- // 验签证书同后台验签证书
- // 此处的verify,商户需送去商户后台做验签
- // boolean ret = verify(dataOrg, sign, "1");
- boolean ret = true;
- if (ret) {
- // 验证通过后,显示支付结果
- msg = "支付成功!";
- } else {
- // 验证不通过后的处理
- // 建议通过商户后台查询支付结果
- msg = "支付失败!";
- }
- } catch (JSONException e) {
- }
- } else {
- // 未收到签名信息
- // 建议通过商户后台查询支付结果
- msg = "支付成功!";
- }
- } else if (str.equalsIgnoreCase("fail")) {
- msg = "支付失败!";
- } else if (str.equalsIgnoreCase("cancel")) {
- msg = "用户取消了支付";
- }
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle("支付结果通知");
- builder.setMessage(msg);
- builder.setInverseBackgroundForced(true);
- // builder.setCustomTitle();
- builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- });
- builder.create().show();
- }
复制代码 这里拿到的支付结果也是银联同步返回的结果,真实开发的话app还要再给自己的服务器发送一个查询支付结果的请求,以服务器的支付结果为准。
注:支付宝支付使用的的合作者id密钥等保存到了服务器端,我们这里使用的是本地的服务器,由于隐私问题服务器不能发给大家,等后面申请了网络服务器之后会把网络地址告诉大家,这样大家就可以做支付宝支付的练习了。微信支付和银联支付是官网提供了测试账号和测试的服务器端,所以这两个大家可以直接写代码练习了。
01_支付宝支付:http://bbs.itheima.com/thread-305148-1-1.html
03_微信支付:http://bbs.itheima.com/thread-305151-1-1.html
|