参考资料:

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash

Android支付接入(五):机锋网

--- 网页支付

http://wappaygw.alipay.com/service/rest.htm?
req_data=
<direct_trade_create_req>
<subject></subject>
<out_trade_no></out_trade_no>
<total_fee></total_fee>
<seller_account_name>che12121</seller_account_name>
<notify_url>http://www.alipay.com/waptest0504/servlet/NotifyReceiver</notify_url>
<out_user>outID123</out_user>
<merchant_url>http://www.alipay.com</merchant_url>
<pay_expire></pay_expire>
</direct_trade_create_req>
&service=alipay.wap.trade.create.direct
&sec_id=&partner=
&req_id=
&sign=bDfw5%2Bctc3pxzl7emPxqOod4EiPu3BkE0 Um54g4whHT22CwLbOn1gzyE%2BU5SIleGPke2rNQ%3D
&format=xml
&v=2.0

网页支付拿这服务器返回的地址,通过webview直接请求就可以

public class AlipayWebActivity extends Activity {
private WebView mWebView;
private ProgressDialog mProgressDialog;
private static final String TAG = "AlipayWebActivity";
protected static final int PAY_SUCCESS = ;
protected static final int LOAD_FINISH_CODE = ;
private static final int DEFAULT_CODE = ; private ImageView quitImageView; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web);
FactoryUtil.getInstance().addActivity(this); quitImageView = (ImageView) findViewById(R.id.iv_quit); mWebView = (WebView) findViewById(R.id.webview);
mWebView.setBackgroundColor(); initial(); quitImageView.setOnClickListener(new MyOnClickListener());
} @SuppressLint({ "SetJavaScriptEnabled", "HandlerLeak" })
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void initial() {
String url = getIntent().getStringExtra("url");
LogUtil.i(TAG, url);
WebSettings webSettings = mWebView.getSettings();
mWebView.requestFocus();
webSettings.setJavaScriptEnabled(true);
mWebView.setFocusable(true);
webSettings.setBuiltInZoomControls(true); mWebView.setScrollBarStyle();
if (MobileUtil.getMobileVersion()>) {
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
mWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
LogUtil.i(TAG, "newProgress: " + newProgress);
if (newProgress == && mProgressDialog!=null) {
mProgressDialog.dismiss();
}
super.onProgressChanged(view, newProgress);
}
}); mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogUtil.i(TAG, "URL : " + url);
LogUtil.i(TAG, "URL : " + url.contains("&cmd=success&"));
loadUrl(view, url);
return true;//停止在当前界面
}
public void onPageFinished(WebView view, String url) {
LogUtil.i(TAG, "onPageFinished" + url);
//trade_status : TRADE_FINISHED,成功之后处理 super.onPageFinished(view, url); }
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
LogUtil.i(TAG, "onPageStarted" + url);
}
}); loadUrl(mWebView, url);
} @SuppressLint("HandlerLeak")
private Handler mUihandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case PAY_SUCCESS:
clearCache();
FactoryUtil.getInstance().exit();
break;
case LOAD_FINISH_CODE:
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
break;
case DEFAULT_CODE:
showProgressDialog(AlipayWebActivity.this,
R.string.dialog_loading);
}
super.handleMessage(msg);
}
}; private void loadUrl(final WebView webView, final String url) { mUihandler.sendEmptyMessage(DEFAULT_CODE);
webView.loadUrl(url); } public boolean onKeyDown(int keyCode, KeyEvent event) {
LogUtil.i(TAG, "can goback:" + mWebView.canGoBack());
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
mWebView.goBack();
return true;
} else if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
return super.onKeyDown(keyCode, event);
} public void showProgressDialog(Context context, int message) {
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(context);
mProgressDialog.setMessage(context.getText(message));
mProgressDialog.show();
}
} private void clearCache() {
mWebView.clearCache(true);
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
finish();
} private class MyOnClickListener implements OnClickListener{
@Override
public void onClick(View v) {
int id = v.getId();
if (id==R.id.iv_quit) {
finish();
}
}
}
}

--- 快捷支付
1、公钥,密钥,签名在服务器端完成,比放在客户端安全。
2、报4000 4100一般就是参数出现错误,仔细比对,如果参数都没问题,很有可能是sign也就是签名没有通过。签名之后不能对已经签名的字符串做任何修改,因为支付宝需要解密的。
3、如果报服务器繁忙,然后打印出参数非法的警告信息时, KeyFactory.getInstance("RSA", "BC") 可以解决。
4、sign签名要utf-8格式。

/*
* Copyright (C) 2010 The MobileSecurePay Project
* All right reserved.
* author: shiqun.shi@alipay.com
*/ package com.ztgame.dudu.payment.alipay; import android.app.Activity;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast; import com.alipay.android.app.sdk.AliPay;
import com.ztgame.dudu.payment.R;
import com.ztgame.dudu.payment.ui.FactoryUtil;
import com.ztgame.dudu.payment.util.BaseDialogUtil;
import com.ztgame.dudu.payment.util.LogUtil; public class AlipayUtil { private static String TAG = "AlipayUtil";
private Activity activity;
private String order;
private static final int RQF_PAY = 1; private static final int RQF_LOGIN = 2; public AlipayUtil(Activity activity, String order) {
this.activity = activity;
this.order = order;
LogUtil.i(TAG, activity.toString() + " "
+ activity.getMainLooper().toString());
} public void pay() {
// 根据订单信息开始进行支付
try { new Thread() {
public void run() {
AliPay alipay = new AliPay(activity, mHandler);
String result = alipay.pay(order);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);
}
}.start();
} catch (Exception ex) {
Toast.makeText(activity, R.string.pay_fail,Toast.LENGTH_SHORT).show();
activity.finish();
}
} Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Result result = new Result((String) msg.obj);
switch (msg.what) {
case RQF_PAY:
case RQF_LOGIN: {
try {
String ret = result.getResult();
result.parseResult();
LogUtil.i(TAG, ret);
LogUtil.i(TAG, "1: " + result.isSignOk + " 2: "
+ result.memo + " 3: " + result.resultStatus);
// 先验签通知
// 1: false 2: 3: 操作成功(9000)
// 验签失败
if (result.isSignOk) {
Toast.makeText(activity, R.string.check_sign_fail, Toast.LENGTH_SHORT).show();
} else {// 验签成功。验签成功后再判断交易状态码
if ("操作成功(9000)".equals(result.resultStatus)) {// 判断交易状态码,只有9000表示交易成功                   //成功之后执行 });
} else {
Toast.makeText(activity,
"支付失败。交易状态码:" + result.resultStatus,
Toast.LENGTH_SHORT).show();
}

} catch (Exception e) {
e.printStackTrace();
Toast.makeText(activity, R.string.pay_fail, Toast.LENGTH_SHORT).show();
}
}
break;
default:
break;
}
};
}; }

剩下的文档里面都有,只需要处理的是支付成功与失败的逻辑。

提交到支付宝的订单快捷支付:

partner=""&out_trade_no=""&subject="支付0.01元"&body="支付0.01元"&total_fee="0.01"
&notify_url="http%3A%2F%2F122.32.196.157%3A90%2Freeonse%2Falipaydut"&service="mobile.securitypay.pay"&_input_charset="utf-8"&payment_type=""&seller_id=""&show_url="m.alipay.cm"
&it_b_pay="30m"&sign="MPZ8lamKUDgidaIn2KwX%2B6GX4o3BSheEUI2xg3aJa1b%2B1M6VXP%2BaMA3szSBPyl7UYm%2Fdhz8KVuFn5Du057R2lUNQ%2B2nSb3qSXZ6rZcNQ2rCrZ84Kiy3MWFBqlt%2Buq%2FufaCOnGEQyo18NXnm6OGDazSMppQP9cr434ILLguhcntM%3D"
&sign_type="RSA"

Android学习笔记_69_android 支付宝之网页支付和快捷支付的更多相关文章

  1. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  2. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu

    目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...

  3. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  4. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  5. Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity

    文章转载仅仅能用于非商业性质,且不能带有虚拟货币.积分.注冊等附加条件.转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei. 通过widget定义 ...

  6. Android学习笔记:Home Screen Widgets(2):关于Widget

    通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的ja ...

  7. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  8. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  9. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

随机推荐

  1. TOJ 3744 Transportation Costs

    描述 Minya Konka decided to go to Fuzhou to participate in the ACM regional contest at their own expen ...

  2. git win7 dos下设置代理

    git config --global http.proxy http://username:pwd@my.you.com:port

  3. 聚焦游戏安全,腾讯云GAME-TECH“空降”上海

    游戏行业是DDoS攻击高发行业,占DDoS攻击的六成以上,特别是近年来游戏行业的爆发式增长,游戏行业更成为了黑产.外挂.非法信息的聚集地.安全,已然成为游戏行业当前最大的敌人. 6月29日,腾讯云GA ...

  4. json数据的存储与读取

    1.  json数据格式: data = [ {"key1":"xxx","item":"ddd"}, {"k ...

  5. C# ADO.NET

    ADO.NET 作业总结难点 数据库语句掌握太差 //查询 select * from Users //查询表中所有数据 select * from Users where UserName = 'l ...

  6. Html-知识总结

    1.Html概述 1.1什么是Html Html:超文本标记语言(hyperText Markup Language) “超文本”加上指页面内可以包含图片,链接等非文字内容. “标记”就是使用标签的方 ...

  7. js之闭包

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个对Array的求和.通常情况下,求和的函数是这样定义的: function sum(arr) { ret ...

  8. JavaSE环境Shiro的搭建及常用API

    通过shiroAPI来进行角色的管理 模拟用户是否登录: 模拟用户是否具有相应的权限:

  9. Csharp: FreeTextbox 编辑器控件运行时错误: 'FTB_ResizeGalleryArea' 未定义

    ftb.imagegallery.aspx 改一下代码: <form id="Form1" runat="server" enctype="mu ...

  10. jQuery基础——选择器、效果

    一.使用JS的痛处 在学习和使用js的过程中发现了js的一些痛处: 1.书写繁琐,代码量大. 2.代码复杂. 3.动画效果很难实现.使用定时器,要小心各种定时器的清除.各种操作和处理事件不好实现. 4 ...