Android学习笔记_69_android 支付宝之网页支付和快捷支付
参考资料:
https://b.alipay.com/order/productDetail.htm?productId=2013080604609654
https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash
--- 网页支付
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"
¬ify_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 支付宝之网页支付和快捷支付的更多相关文章
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】Pro Android学习笔记(三十):Menu(1):了解Menu
目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity
文章转载仅仅能用于非商业性质,且不能带有虚拟货币.积分.注冊等附加条件.转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei. 通过widget定义 ...
- Android学习笔记:Home Screen Widgets(2):关于Widget
通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的ja ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
随机推荐
- Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
9.5 Predicting Movie Ratings9.5.1 Problem Formulation推荐系统.推荐系统的问题表述:电影推荐.根据用户对已看过电影的打分来推测用户对其未打分的电影将 ...
- 对C++ Local的经典分析(转)
对C++ Local的经典分析 本贴转载自:再别流年的技术实验室 文章地址: http://kittsoft.xp3.biz/?p=86 “这个问题比你想象中复杂”(我也学下BS的风格,虽然这句话是我 ...
- tomcat和应用集成
将tomcat作为应用的一部分集成到应用中,使得应用可以直接开启http服务,对外提供接口.此时应用程序不必再遵守j2ee中的文件目录格式要求. 此种方式改变了以往先部署tomcat容器,再按照j2e ...
- 初学Hadoop之WordCount词频统计
1.WordCount源码 将源码文件WordCount.java放到Hadoop2.6.0文件夹中. import java.io.IOException; import java.util.Str ...
- MVC Request.UrlReferrer为null
使用情景,登录后返回登录前访问的页面. 这个时候用到了UrlReferrer var returnUrl = HttpContext.Current.Request.UrlReferrer != nu ...
- PHP file_put_contents() 函数
file_put_contents() 函数把一个字符串写入文件中. 与依次调用 fopen(),fwrite() 以及 fclose() 功能一样. 语法如下 file_put_contents(f ...
- html中通过移除空格的方法来解决浏览器上的留白间距该怎么理解?
今天在切图的时候,碰到一个兼容性的问题,很幸运最后通过张金鑫老师的文章解决了这个问题!但在阅读张老师文章的时候,我有个地方不明白,在网上查了下也没找到我想要的答案,后来自己想了半天好像是这么回事,现在 ...
- sharepoint2007就地升级2010系列(一)2007概览
大家可能熟悉了sharepoint2010,熟悉了sharepoint2013,做了N多个项目,但是有没有做过从sharepoint2007升级或者迁移到sharepoint2010的项目呢?我们做实 ...
- Linux漏洞分析入门笔记-CVE-2015-0235
Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...
- Java NIO(二) Channel
Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Bu ...