参考资料:

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. xlua的自定义加载

    具体可以先看xlua的自定义加载的demo,那个用lamda表达式做的 我这个更好理解 主要是ReadFile2的结构问题,必须的写成这样

  2. 错误:38-Corel VideoStudio文件已损坏或被修改。请重新安装原始来源解决方法。

    打开 Corel VideoStudio Pro X5(绘声绘影)弹出一下警告. 错误:38-Corel VideoStudio文件已损坏或被修改.请重新安装原始来源解决方法. [第一方法]:控制面板 ...

  3. 日期控件html

    日期控件多的是,这里收录的是最简单的一种 <html> <head> <script type="text/javascript"> funct ...

  4. 如何查询日志文件中的所有ip,正则表达式

    IPV4必须满足以下四条规则: 1.任何一个1位或2位数字,即0-99: 2.任何一个以1开头的3位数字,即100-199: 3.任何一个以2开头.第2位数字是0-4之间的3位数字,即200-249: ...

  5. js之箭头函数

    原文 ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: ...

  6. javascript: iframe switchSysBar 左欄打開關閉,兼容各瀏覽器操作

    <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Con ...

  7. ZROJ#398. 【18提高7】随机游走(期望dp 树形dp)

    题意 [题目链接]版权原因就不发了.. 给出一棵树,求出任意两点之间期望距离的最大值 Sol 比较清真的一道题吧.. 设\(f[x]\)表示从\(x\)走到\(x\)的父亲的期望步数 \(g[x]\) ...

  8. iframe中插入代码并执行

    最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...

  9. Swiper双向轮播

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. IntelliJ IDEA热部署教程,只要两步!

    一.开启idea自动build功能1.File -> Settings -> Build,Execution,Deployment -> Compiler -> Build p ...