嗯,其实官方的文档和DEMO够用了,只是我悟性太不堪。

为自己把过程要点给备忘一下。

## 准备工作

1. 要有一个支付宝账号

3. 完成后登录 ms.alipay.com 在“我的产品页” 会见到 账户信息像以下内容

账户ID:208800*******993

合作商户ID:2088*******993

4. 这个时候先不管密钥管理,先去下载SDK包和文档,

解压出以下东东备用

DEMO项目  //里面有好多现成的类,好东西~

mobile_sp.jar //支付的类库

mobile_sp.apk //支付宝安全支付控件,手机支付的前提,可捆绑在应用安装包内支付前检测和提示用户安装

RSA密钥的W32生成工具 //不解释... 交易流程sign用

5. 按文档说明生成商家私钥、公钥对,再将私钥转换为 PKCS8 格式,备用~

6. 回到 ms.alipay.com 进入账号信息下的密钥管理,上传刚生成的商家公钥,获得 AliPay的对应公钥,备用~

(注意不要混淆 商家pub_key 和Ali_pub_key)

## 准备工作 part.2

呃,还得准备准备,刚才说了DEMO里面有很多好东西,可以直接拿来就用,省下不少爬文档和代码的时间省力又省心..有用的是

AlixId.java

Base64.java

BaseHelper.java

MobileSecurePayer.java

MobileSecurePayHelper.java

NetworkManager.java

ResultChecker.java

Rsa.java

全部拿出来扔到我们自己的项目包内,然后逐一来看看

AlixId.java ——这个不需要动,只是一些静态的全局变量;

Base64.java ——编码算法,不动;

Rsa.java ——同上,不动;

BaseHelper.java ——一些调用 ProgressDialog AlertDialog 还有格式转换的现成的方法,不动;

MobileSecurePayer.java ——不用改动,里面的 pay((String, Handler, int, Activity) ,支付用它;

MobileSecurePayHelper.java——这里要注意,捆绑安装支付控件的话,要把mobile_sp.apk 放到项目 assets 路径下,文件名可以改别的随便,但要注意与源码中52行 cachePath 文件名一致,还有 retrieveApkFromAssets()中的第二个文件名参数一致。若还打算提供在线下载安装控件的话还要更改 apkUrl ,url根据实际情况修改。其余的不用动,是一些检验、安装安全控件的方法;

NetworkManager.java ——不用动,上面如果启用了在线下载安装控件,就要用到这个包实现下载。

ResultChecker.java ——支付结果的解释和校验用,留意 Rsa.doCheck() 的第三个参数,这里要用的是 Ali_pub_key;

## 开工集成

public class Pay extends Activity {

Spinner spPrice;   //下拉菜单,有几个不同金额的支付项目选择

Button btAlipayl; //支付按钮

ProgressDialog pd; //提示Loading信息用

/** Called when the activity is first created. */

@Override    public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.pay);

//绑定实例

spPrice = (Spinner) findViewById(R.id.sp_pay);

btAlipay = (Button) findViewById(R.id.bt_pay_alipay);

pd = new ProgressDialog(this);

pd.setCancelable(false);

//点击支付按钮

btAlipay.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

// check to see if the MobileSecurePay is already installed. 没有支付安全控件的话提示安装

MobileSecurePayHelper mspHelper =  new MobileSecurePayHelper(Pay.this);

boolean isMobile_spExist = mspHelper.detectMobile_sp();

if( !isMobile_spExist )

return;

// start pay for this order.

try

{

// prepare the order info.

String orderInfo  = getOrderInfo(spPrice.getSelectedItemPosition()); //组织要发去支付接口的数据,这里传递了一个下拉菜单的选中序号,我在Array.xml仲分别定义了下拉菜单各项对应的商品名称、详情、价格数组

String strsign   = Rsa.sign(orderInfo,getString(R.string.privateKey_Rsa)); //rsa算法,文档说支持md5,我用出错不清楚原因,换回来了

strsign    = URLEncoder.encode(strsign);

String info   =  orderInfo

+ "&sign=" +  "\"" + strsign  + "\""

+ "&" + getSignType();

// start the pay. 支付

MobileSecurePayer msp = new MobileSecurePayer();

boolean bRet = msp.pay(info, mHandler, AlixId.RQF_PAY, Pay.this);

if( bRet )

{// 尝试收起ProgressDialog

try

{ if( pd != null ) pd.dismiss(); }

catch(Exception e)

{e.printStackTrace(); }

//然后投放支付中的提示

pd.setMessage("正在支付");

pd.show();

}

else ;

}

catch (Exception ex)

{showMsg(getString(R.string.remote_call_failed), false); }

} });

}

//Alipay 的函数族

// get the selected order info for pay. 组织交易数据

String getOrderInfo(int arg2)

{

//以下内容在string.xml 或Array.xml中定义,参考SDK文档

String strOrderInfo = "partner=" + "\"" + getString(R.string.partner) + "\"";

strOrderInfo   += "&";

strOrderInfo   += "seller=" + "\"" + getString(R.string.seller) + "\"";

strOrderInfo   += "&";

strOrderInfo  += "out_trade_no=" + "\"" + getOutTradeNo() + "\"";

strOrderInfo   += "&";

strOrderInfo  += "subject=" + "\"" + getString(R.string.subject) + "\"";

strOrderInfo   += "&";

strOrderInfo  += "body=" + "\"" + getResources().getStringArray(R.array.pay_name)[arg2] + "\"";

strOrderInfo   += "&";

strOrderInfo  += "total_fee=" + "\"" + getResources().getStringArray(R.array.pay_ap)[arg2] + "\"";

strOrderInfo   += "&";

strOrderInfo  += "notify_url="  + "\"" + getString(R.string.notify_url) + "\"";

return strOrderInfo;

}

// get the out_trade_no for an order.根据文档生成一个不重复的商家交易号ID

String getOutTradeNo()

{

SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss");

Date date = new Date();

String strKey = format.format(date);

java.util.Random r = new java.util.Random();

strKey = strKey + r.nextInt();

strKey = strKey.substring(0, 15);

return strKey;

}

// get the sign type we use. 定义签名的算法,这里用了RSA

String getSignType()

{

String getSignType = "sign_type=" + "\"" + "RSA" + "\"";

return getSignType;

}

// the handler use to receive the pay result. 接收响应支付结果的 Handler

private Handler mHandler = new Handler()

{

public void handleMessage(Message msg)

{

try

{

String strRet = (String)msg.obj;  //这个是交易结果返回的信息由几部分组成,如: resultStatus={};memo={};result={}

switch (msg.what)

{

case AlixId.RQF_PAY:

{

//如果支付中提示仍在,收起

try

{if( pd != null )  pd.dismiss();}

catch(Exception e)

{e.printStackTrace(); }

//把返回的结果拆包..解析成各部分信息,包括交易结果的状态码、错误信息等

try

{

String memo  = "memo=";

int imemoStart  = strRet.indexOf("memo=");

imemoStart  +=  memo.length();

int imemoEnd  = strRet.indexOf(";result=");

memo = strRet.substring(imemoStart, imemoEnd);

BaseHelper.showDialog(PayForm.this, "提示", memo, R.drawable.icon);

// handle result

ResultChecker resultChecker = new ResultChecker(strRet);

boolean isPayOk = resultChecker.isPayOk(); //这种是严谨的验证支付结果是否成功的方法,不严谨的可以只检测状态码是否9000详情参考文档说明

if(isPayOk){//支付成功了,以下该干啥干啥...

... ...

}else ;  //支付不成功的处理...

}

catch(Exception e)

{ e.printStackTrace();      }

}

break;

}

super.handleMessage(msg);

}

catch(Exception e)

{e.printStackTrace();}

} };

}

android 支付宝是否安装包,Android App集成支付宝相关推荐

  1. android版本10安装包,Android 10系统,Android 10手机系统正式版安装预约 v10.0-手游汇...

    Android 10系统正式版上线啦,如果你是一个安卓机的使用用户,那么更新到的10系统,等你上线开启你的更新操作.无需任何的复杂操作,只需要在手机应用商店点击进行更新,你就可以获得全新上线的新系统体 ...

  2. android apk自动安装包下载,apk安装包管理app下载-apk安装包文件管理 安卓版v13-PC6安卓网...

    apk安装包文件管理app是一款实用系统应用,apk安装包文件管理app是个小巧好用的手机内安装包管理工具.apk安装包文件管理app让你可快捷的管理手机里有意或无意下载的各种安装包. 软件介绍 ap ...

  3. 移动APP集成支付宝--服务器端设计

    最近开发APP时需要集成支付宝支付,作为一名小小的服务器端后台开发者针对此次集成做以下整理,希望能够给大家带来帮助,同时作为工作节点的一个回馈.好了,正式进入服务器端集成的工作流程: 本次集成使用支付 ...

  4. Android App集成支付宝

    http://blog.csdn.net/wenzhibinbin_pt/article/details/7933078 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传 ...

  5. 导出android app安装包,Android app导出apk方法

    出处:http://my.oschina.net/u/199776/blog/339952 一.背景 很多时候,APK文件只存在于应用市场,在PC上无法直接下载.用手机下载下来后就直接安装了,也不能保 ...

  6. android 8.0应用内安装包,Android 8.0 下载安装进入【安装未知应用】页面,两步简化一步...

    小菜昨天接到客户反馈的问题,说华为手机升级到 Android 8.0 系统以后,程序升级下载之后不能安装:找一个手机测试果然如此,每次下载完之后不跳转安装页面,重新进入程序又继续下载,之后依旧不跳转安 ...

  7. Android 9.0 安装包解析错误

    Android studio打包的debug和release 包 安装到android9.0版本 提示安装包解析错误,因为之前在 manifest文件里面为了解决androidx冲突问题,在appli ...

  8. Android studio 提示安装包异常 安装错误 INSTALL_FAILED_TEST_ONLY

    真我手机升级到了Android 12,发现调试安装时出现"安装失败,安装包异常"的异常. 错误提示 The application could not be installed: ...

  9. 魅色android安装包,Android 安装包

    1. /data/system/packages.xml ++/data/system/packages.xml++由PackageManagerService.java生成,里面记录了系统当中安装的 ...

最新文章

  1. Java就业难不难?是否要参加Java培训?
  2. python参数方法_Python方法的几种常见参数类型
  3. php调用restful接口_jzq_sdk_php
  4. ABAP:下载服务器文件到本机
  5. Java与ElasticSerach的整合
  6. android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...
  7. 《记得我们有约》17集
  8. Git如何创建本地分支并推送到远程仓库
  9. pxe无人值守智能安装linux
  10. mysql lex yacc脚本_终于成功配置lex和yacc的工具Parser Generator
  11. pic由c语言和汇编语言,单片机教程:PIC单片机C语言程序设计(二)
  12. echarts横向柱状图
  13. CFSSL: 证书管理工具:2:创建CA私钥与CA证书
  14. 初窥 Python 的 import 机制
  15. 《C语言程序设计》单元总结与练习题
  16. 微信小程序:WeUI一个专为微信小程序设计的UI框架
  17. 使用 FRP 搭建内网穿透,流畅运行远程桌面!
  18. java怎么写dnf辅助_易语言地下城与勇士辅助自动刷图类源码
  19. 太子阿特士和公主哈娅·图芙丝之梦的故事(一)
  20. 清华2020计算机系张晨,清华公布2020特奖候选人名单!平均21岁,还有一姚班大神...

热门文章

  1. pad端无法触发touchmove事件
  2. jenkins填坑记录
  3. 浪潮服务器sa5212m4重装阵列卡信息,浪潮英信服务器SA5212M4
  4. loss值多少才算收敛_银行福利中的六险二金是怎么算的,到底值多少钱?
  5. 【答学员问】完全零基础培训IT,学习能跟的上吗?
  6. 【运维技术面试】容器的交付流程是什么?
  7. 计算机主机不通电,电脑主机不通电和电脑主机频繁黑屏的特殊情况的解决方法 --岁月博客提供...
  8. 【机房收费系统】——傻瓜式报表设计器制作报表模板
  9. 牛客-计算机复试题-求图的连通分支数
  10. MarkDown表格以及文字对齐设置