支付宝客户端官方下载和支付宝app是同一个吗

手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能。人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验。谷歌刚推出了谷歌钱包,这必是我们后面要使用的主要手段,但是鉴于当前国情,我觉得有必要介绍一下android手机集成支付宝功能。&
1.下载官方架包和说明文档其实官方已经提供了安装指南,下载地址:
里面有有个pdf,详细说明了说用指南,写的比较详细,可以重点参考。
下载下来,我们主要是用到Android()目录下的alipay_plugin.jar和AppDemo/assets下的alipay_plugin223_0309.apk,这两个文件是我们不能修改的支付宝api和安装包。
2. 商户签约现在的安全机制,都是这样,客户端需要先和服务端请求验证后才能进行进一步操作,oauth也是如此。打开/,登陆支付宝,点击签约入口,选择"应用类产品",填写并等待审核,获取商户ID和账户ID。签约的时候还要向需要提供实名认证和上传应用,所以我建议先把应用做好了,最后再集成支付宝。
我大概等了1-2天审核,审核是失败的,回复是应用类型啥的应该是"虚拟货币",我改成那个马上自动就审核通过了。
3.密钥配置解压openssl-0.9.8k_WIN32(RSA密钥生成工具).zip,打开cmd,命令行进入openssl-0.9.8k_WIN32(RSA密钥生成工具)\bin目录下,(1).执行
openssl genrsa& -out rsa_private_key.pem 1024
生成rsa_private_key.pem文件。(2).再执行
openssl rsa& -in rsa_private_key.pem& -pubout -out rsa_public_key.pem
生成rsa_public_key.pem 文件。(3).在执行
openssl pkcs8& -topk8& -inform PEM& -in rsa_private_key.pem& -outform PEM& -nocrypt
将RSA私钥转换成 PKCS8 格式,去掉begin和end那两行,把里面的内容拷贝出来,保存到某个txt中,如rsa_private_pkcs8_key.txt中(我好像没用到这个)。打开rsa_public_key.pem,即商户的公钥,复制到一个新的TXT中,删除文件头&-----BEGIN PUBLIC KEY-----&与文件尾&-----END PUBLIC KEY-----&还有空格、换行,变成一行字符串并保存该 TXT 文件,然后在网站的&我的商家服务&切换卡下的右边点击&密钥管理&,然后有个"上传商户公钥(RSA)"项,选择上传刚才的TXT文件.好了,服务器配置OK,因为这一段之前没有截图,现在弄好了又不好截图,如果有不明白的地方请大家参考官方文档。&
错误提示 failure calling remote service&原因: 私钥没转PKCS8
4.引用jar和包含安装包& & (1).新建android工程;& & (2).copy上面说的alipay_plugin.jar到工程的libs目录下,并在java build path中通过Add External JARs找到并引用该jar;& & (3).copy上面说的alipay_plugin223_0309.apk安装包到assets目录下,后面配置路径用到。
如果libs和assets目录没有,手动建立者两个目录。
5.调用代码整理这里我们要严重的参考文档中AppDemo,我们建一个包com.tianxia.lib.baseworld.alipay,把AppDemo的com.alipay.android.appDemo4包下的源码全部copy到刚才我们自己的包下,还有res目录下的资源文件也合并到我们工程res下。其中AlixDemo.java,ProductListAdapter.java,Products.java是示例类,我们借鉴完后可以删除。PartnerConfig.java是配置类,配置商户的一些配置参数。其他的类是严重参考类,直接留下使用。PartnerConfig.java代码如下:
public&class&PartnerConfig {
&&&&public&static&final&String PARTNER = "xxx";
&&&&public&static&final&String SELLER = "xxx";
&&&&public&static&final&String RSA_PRIVATE = "xxx";
&&&&public&static&final&String RSA_ALIPAY_PUBLIC = "xxx";
&&&&public&static&final&String ALIPAY_PLUGIN_NAME ="alipay_plugin223_0309.apk";
AlixDemo中代码是最终的调用代码在onItemClick(AdapterView&?& arg0, View arg1, int arg2, long arg3) {}中,下面我们提取其中的核心代码。
6.提取核心调用代码在AlixDemo.java同目录下新建AlixPay.java,来提取AlixDemo.java的核心代码:
package&com.tianxia.lib.baseworld.
import&java.net.URLE
import&java.text.SimpleDateF
import&java.util.D
import&com.tianxia.lib.baseworld.R;
import&android.app.A
import&android.app.ProgressD
import&android.content.DialogI
import&android.os.H
import&android.os.M
import&android.view.KeyE
import&android.widget.T
public&class&AlixPay {
&&&&static&String TAG = "AlixPay";
&&&&private&Context&mC
&&&&public&AlixPay(Context mContext) {
&&&&&&&&mContext= mC
&&&&private&ProgressDialog mProgress = null;
&&&&private&Handler mHandler = new&Handler() {
&&&&&&&&public&void&handleMessage(Message msg) {
&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&String strRet = (String) msg.
&&&&&&&&&&&&&&&&switch&(msg.what) {
&&&&&&&&&&&&&&&&case&AlixId.RQF_PAY: {
&&&&&&&&&&&&&&&&&&&&closeProgress();
&&&&&&&&&&&&&&&&&&&&BaseHelper.log(TAG, strRet);
&&&&&&&&&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&&&&&&&&&String memo = "memo=";
&&&&&&&&&&&&&&&&&&&&&&&&int&imemoStart = strRet.indexOf("memo=");
&&&&&&&&&&&&&&&&&&&&&&&&imemoStart += memo.length();
&&&&&&&&&&&&&&&&&&&&&&&&int&imemoEnd = strRet.indexOf(";result=");
&&&&&&&&&&&&&&&&&&&&&&&&memo = strRet.substring(imemoStart, imemoEnd);
&&&&&&&&&&&&&&&&&&&&&&&&ResultChecker resultChecker = new&ResultChecker(strRet);
&&&&&&&&&&&&&&&&&&&&&&&&int&retVal = resultChecker.checkSign();
&&&&&&&&&&&&&&&&&&&&&&&&if&(retVal == ResultChecker.RESULT_CHECK_SIGN_FAILED) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&BaseHelper.showDialog(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mContext,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"提示",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mActivity.getResources().getString(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&R.string.check_sign_failed),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android.R.drawable.ic_dialog_alert);
&&&&&&&&&&&&&&&&&&&&&&&&} else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&BaseHelper.showDialog(mActivity, "提示", memo,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&icon);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&} catch&(Exception e) {
&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&&&&&BaseHelper.showDialog(mContext, "提示", strRet,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&icon);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&super.handleMessage(msg);
&&&&&&&&&&&&} catch&(Exception e) {
&&&&&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&&&&&}
&&&&void&closeProgress() {
&&&&&&&&try&{
&&&&&&&&&&&&if&(mProgress != null) {
&&&&&&&&&&&&&&&&mProgress.dismiss();
&&&&&&&&&&&&&&&&mProgress = null;
&&&&&&&&&&&&}
&&&&&&&&} catch&(Exception e) {
&&&&&&&&&&&&e.printStackTrace();
&&&&public&void&pay() {
&&&&&&&&MobileSecurePayHelper mspHelper = new&MobileSecurePayHelper(mContext);
&&&&&&&&boolean&isMobile_spExist = mspHelper.detectMobile_sp();
&&&&&&&&if&(!isMobile_spExist)
&&&&&&&&&&&&return;
&&&&&&&&if&(!checkInfo()) {
&&&&&&&&&&&&BaseHelper.showDialog(mContext, "提示",
&&&&&&&&&&&&&&&&&&&&"缺少partner或者seller,", icon);
&&&&&&&&&&&&return;
&&&&&&&&try&{
&&&&&&&&&&&&
&&&&&&&&&&&&String orderInfo = getOrderInfo();
&&&&&&&&&&&&String signType = getSignType();
&&&&&&&&&&&&String strsign = sign(signType, orderInfo);
&&&&&&&&&&&&strsign = URLEncoder.encode(strsign);
&&&&&&&&&&&&String info = orderInfo + "&sign="&+ "\""&+ strsign + "\""&+ "&"
&&&&&&&&&&&&&&&&&&&&+ getSignType();
&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&MobileSecurePayer msp = new&MobileSecurePayer();
&&&&&&&&&&&&boolean&bRet = msp.pay(info, mHandler, AlixId.RQF_PAY, mContext);
&&&&&&&&&&&&&
&&&&&&&&&&&&if&(bRet) {
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&closeProgress();
&&&&&&&&&&&&&&&&mProgress = BaseHelper.showProgress(mActivity, null, "正在支付", false,
&&&&&&&&&&&&&&&&&&&&&&&&true);
&&&&&&&&&&&&} else
&&&&&&&&&&&&&&&&;
&&&&&&&&} catch&(Exception ex) {
&&&&&&&&&&&&Toast.makeText(mActivity, R.string.remote_call_failed,
&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();
&&&&private&boolean&checkInfo() {
&&&&&&&&String partner = PartnerConfig.PARTNER;
&&&&&&&&String seller = PartnerConfig.SELLER;
&&&&&&&&if&(partner == null&|| partner.length() &= 0&|| seller == null
&&&&&&&&&&&&&&&&|| seller.length() &= 0)
&&&&&&&&&&&&return&false;
&&&&&&&&return&true;
&&&&String getOrderInfo() {
&&&&&&&&String strOrderInfo = "partner="&+ "\""&+ PartnerConfig.PARTNER + "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "seller="&+ "\""&+ PartnerConfig.SELLER + "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "out_trade_no="&+ "\""&+ getOutTradeNo() + "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "subject="&+ "\""&+ mActivity.getString(R.string.donate_subject) + "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "body="&+ "\""&+ mActivity.getString(R.string.donate_body) + "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "total_fee="&+ "\""&+ "10.00"&+ "\"";
&&&&&&&&strOrderInfo += "&";
&&&&&&&&strOrderInfo += "notify_url="&+ "\""
&&&&&&&&&&&&&&&&+ ""&+ "\"";
&&&&&&&&return&strOrderI
&&&&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&strK
&&&&String getSignType() {
&&&&&&&&String getSignType = "sign_type="&+ "\""&+ "RSA"&+ "\"";
&&&&&&&&return&getSignT
&&&&String sign(String signType, String content) {
&&&&&&&&return&Rsa.sign(content, PartnerConfig.RSA_PRIVATE);
&&&&static&class&AlixOnCancelListener implements
&&&&&&&&&&&&DialogInterface.OnCancelListener {
&&&&&&&&AlixOnCancelListener(Activity context) {
&&&&&&&&&&&&mcontext =
&&&&&&&&public&void&onCancel(DialogInterface dialog) {
&&&&&&&&&&&&mcontext.onKeyDown(KeyEvent.KEYCODE_BACK, null);
这个类的pay方法就是支付的方法,最简单的不设置的话,调用方法如下:
AlixPay alixPay = new&AlixPay(SettingTabActivity.this);
alixPay.pay();
如果没有安装支付宝,它会提示你安装,如果已经安装,它直接让你选择付款:
这说明已经配置成功了。然后可以删掉那些示例java文件了:&AlixDemo.java,ProductListAdapter.java,Products.java。&你也可以通过调整参数来修改订单信息,如主题,价格等。另外在BaseHelper的94行:
dialog.setOnCancelListener( new&AlixDemo.AlixOnCancelListener( (Activity)context ) );
需要修改为:
dialog.setOnCancelListener( new&AlixPay.AlixOnCancelListener( (Activity)context ) );
如果不是下面这种情况不需要改,不然你按下面操作会卡在正在运行中
我在测试的时候,调用的activity是框在一个ActivityGroup里的(与tabhost类似,据说tabhost也有这个问题),导致MobileSecurePayer.java的pay方法中调用服务的两行代码:
mActivity.bindService(new&Intent(IAlixPay.class.getName()), mAlixPayConnection, Context.BIND_AUTO_CREATE);
mActivity.unbindService(mAlixPayConnection);
需要修改为:
mActivity.getApplicationContext().bindService(new&Intent(IAlixPay.class.getName()), mAlixPayConnection, Context.BIND_AUTO_CREATE);
mActivity.getApplicationContext().unbindService(mAlixPayConnection);
不然会报错java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token...
8.小结支付宝的集成比我想象的要复杂一些,比较麻烦,首先需要审核,然后代码需要提取,所以写出来与大家分享。&在做集成配置的时候,一定要仔细认真,一个地方出错,可能要导致后面查错查很长时间。因为本人是先集成成功后才写的这篇文章,难免会漏掉一些重要的细节或者步骤,如有不对,请留言指正。
阅读(...) 评论()支付宝APP接入的那些坑们 - 推酷
支付宝APP接入的那些坑们
这几天工作是APP的支付宝接入,做了WAP的,感觉很简单,MD5做签名,实现alipay支付完成同步的return和异步的notify,更新本地表单信息即可。因为有其他同事做了WEB端的,WAP端改了服务类型即可。然后任务是做APP端,这坑的数量简直是... ...
坑爹的文档
APP相比较于WAP和WEB,最大的区别就是没有服务端的同步回应了,因为是在APP上付的,所有同步回应是在APP上的客户端的,这样就意味着不能在本机做测试,只有部署在线上的服务才行(WEB方式的话同步的return是通过浏览器的redirect实现的,于是可以写自己的本机IP,浏览器跳转就是我本地的服务了,这样测试起来很简单)。那格式什么的我就只能参考文档了。文档上是这么写的。
http://notify.java.jpxx.org/index.jsp?discount=0.00&payment_type=1&subject=测试&trade_no=4842&buyer_email=&gmt_create= 14:45:23&notify_type=trade_status_sync&quantity=1&out_trade_no=710&seller_id=6263&notify_time= 14:45:24&body=测试测试&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=1.00&gmt_payment= 14:45:24&seller_email=&price=1.00&buyer_id=5429&notify_id=64ce1b6ab92d00ede0ee56ade98fdf2f4c&use_coupon=N&sign_type=RSA&sign=1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs=
URL参数,恩。POST请求,恩。等等,sign里面有+号!!+号!! 没有URL Encode!! 我一边咒骂支付宝傻逼,一边写把等号替换为+的代码... ...然后去上线运行打log的时候我发现...次奥 有Encode的呀.... ....有Encode的呀... ...你这和文档不一样啊。。。文档明明这么写的啊。。。突然觉得自己傻逼了.... ....而且我感觉这个放在URL参数里导致文档和实际不一样,那干脆不如放在requestBody里好了,避免框架自己做encode decode,多方便...
移动端行为不一致
后来我觉得用异步不是很靠谱,于是让移动端把同步回应的结果也发过来,因为我看到文档上是这么写的:
ResultStatus={9000};memo={};result={partner=&8171&&seller_id=&&&out_trade_no=&-6177&&subject=&测试&&body=&测试测试&&total_fee=&0.01&&notify_url=&http://notify.msp.hk/notify.htm&&service=&mobile.securitypay.pay&&payment_type=&1&&_input_charset=&utf-8&&it_b_pay=&30m&&success=&true&&sign_type=&RSA&&sign=&hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU=&}
(iOS和android类似所以贴一份)
那个result里面包含的信息也可以给服务端进行验签、更新表单等操作。
然后我后端实现好了,让安卓和iOS传回来,安卓一切正常,iOS验签死活通不过,我就让iOS把他在console里打印出来的内容给我,我自己调试。发现还是不行,我就怀疑是不是支付宝返回来的东西本身就是验签验不过的啊... ...然后和iOS的同事调试了好久... ...最后一个一个字符和安卓的回应比较过去.... ....发现
notify_time=+16:01:20
这个时间中间为毛是个
,自己手动改成空格之后就过了......是个+号,说明空格被encode了...但这是他console打出来和watch的时候就有的... ...我不知道是支付宝那边弄的,还是xcode的问题,因为安卓是好的... ...iOS这边的空格被encode了.... ....
以为这么就好了嘛?? 安卓试了有支付宝和没支付宝APP的情况,返回内容都是一样的。很好,测试通过。然后iOS....在没有支付宝APP的情况,使用支付宝SDK内嵌的支付的情况...上面的返回数据result是空的!!只有格ResultStatus。让iOS反复检查,后来在网上找了下发现 .cn/s/blog_702e40a80101knln.html,
我的妈阿,对返回值作了改变,为啥文档又没说明,让我等苦逼的程序猿白白折磨了一两天,情何以堪呢。客气的将我的想法提了给支付宝的技术支持,回复说:不要太相信demo。
还是一样的问题,文档没说!
文档坑爹,demo坑爹,剩下的就是自己debug,看日志,做处理了。哎,写文档什么的还是得走心啊。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致您当前位置:
支付宝钱包(支付宝官方客户端) 8.0.0.0110
厂商:支付宝(中国)网络技术有限公司
用户评分:
版本:v8.0.0.0110软件类别:免费软件
点击:146451次
Tag 标签:
扫描二维码,快速下载本应用
支付宝钱包是国内领先的移动支付平台,支持多款精品应用安全登录,更有余额宝理财神器,是数千万人信赖的贴身资产管家。用支付宝钱包,还信用卡、转账、付款、收款、充值、缴费、卡券管理,轻松搞定。【更新内容】【主要功能】
1、开放平台,支持精品应用安全登录;
2、支持余额宝,理财神器随身携带;
3、随时随地查询账单、账户余额、物流信息;
4、免费异地跨行转账,信用卡还款、充值、缴水电煤气费;
5、待办事项管理,还信用卡、付款、缴费、充值、卡券信息智能提醒。
【更新信息】
1)全新开放平台,安全登录精品应用;
2)支持余额宝,理财神器随身携带;
3)按交易方查询资金往来;
4)增加银行网点查询。
【问题修复】
修复已知其他问题。
上一篇:下一篇:
大家正在讨论的应用
热门关键词

我要回帖

更多关于 支付宝钱包官方客户端 的文章

 

随机推荐