安卓支付宝支付如何设置应用网关和应用公钥?

1.下载官方的软件包和文档。

其实官方已经提供了安装指南。

里面有一个pdf,详细解释了口语指南。写的很详细,可以参考。

下载后主要使用Android(20120104)目录下的支付宝_plugin.jar和AppDemo/assets中的支付宝_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 gen RSA-out RSA _ private _ key . PEM 1024

生成rsa_private_key.pem文件。

(2)重新执行

OpenSSL RSA-in RSA _ private _ key . PEM-pub out-out RSA _ public _ key . PEM

生成rsa_public_key.pem文件。

(3).执行中

OpenSSL pkcs 8-top k8-inform PEM-in RSA _ private _ key . PEM-out form PEM-nocrypt

将RSA私钥转换成PKCS8格式,去掉首尾两行,复制内容保存在一个txt中,比如rsa_private_pkcs8_key.txt(我好像不用这个)。

打开rsa_public_key.pem,也就是商家的公钥,复制成一个新的TXT,删除文件头“-”有空格和换行符,然后改成字符串保存TXT文件,再保存在网站中。

好的,服务器配置还可以,因为这一段之前没有截图,现在好了也不好截图。有什么不明白的,请参考官方文件。

4.引用jar并包含安装包

(1).新的android项目;

(2).将上面提到的alipay_plugin.jar复制到项目的libs目录下,通过java构建路径中的Add External JARs找到并引用jar;

(3).复制上面提到的支付宝_plugin223_0309.apk安装在资产目录下,后面会用到配置路径。

\

如果没有库和资源目录,请手动创建它们。

5.呼叫代码分类

这里需要认真参考文档中的AppDemo。我们会构建一个包com . tianxia . lib . base world . AliPay,把刚才appDemo的包com.alipay.android.appDemo4下的源代码全部复制到我们自己的包里,还有res目录下的资源文件复制到我们的项目RES里。

其中alixdemo.java、product list adapter.java、products.java是样本类,我们借鉴后可以删除。

PartnerConfig.java是一个配置类,配置商户的一些配置参数。

其他类都是严肃的引用类,留着直接用。

PartnerConfig.java电码如下:

公共类partner config {//合作伙伴商家ID。用已签名的支付宝账户登录ms.alipay.com后,在账户信息页面获取。public static final String PARTNER = " XXX ";//帐户ID。用已签名的支付宝账户登录ms.alipay.com后,在账户信息页面获取。public static final String SELLER = " XXX ";//Merchant的(rsa_private_key.pem,即去掉第一行的字符串public static final string RSA _ private = " XXX ",最后一行、空格、换行符最后拼成一行;//支付宝的公钥(RSA)是用已签名的支付宝账号登录ms.alipay.com后,在密钥管理页面获取的。PUBLIC static final String RSA _ ALIPAY _ PUBLIC = " XXX ";//下面的配置告诉应用在assets目录下找到安装包public static final string AliPay _ plugin _ name = " AliPay _ plugin 223 _ 0309 . apk ";}

AlixDemo中的代码是最终的调用代码,它在onItemClick(AdapterView<

6.提取核心调用代码

在AlixDemo.java的同一个目录下新建一个AlixDemo.java,提取alix demo . Java的核心代码:

包com .天下. lib.baseworld .支付宝;导入Java . net . URL encoder;导入Java . text . simple date format;导入Java . util . date;导入com .天下. lib . base world . r;导入Android . app . activity;导入Android . app . progress dialog;导入Android . content . dialog interface;导入Android . OS . handler;导入Android . OS . message;导入Android . view . key event;导入Android . widget . toast;公共类alix pay { static String TAG = " alix pay ";私人活动;public alix pay(Activity Activity){ m Activity = Activity;} private progress dialog mProgress = null;//用于接收支付结果的处理程序。private Handler mHandler = new Handler(){ public void handle Message(Message msg){ try { String strRet =(String)msg . obj;switch (msg.what) { case AlixId。RQF _ PAY:{ close progress();BaseHelper.log(TAG,strRet);请尝试{ String memo = " memo =int imemoStart = strret . index of(" memo = ");imemoStart+= memo . length();int imemoEnd = strret . index of(";结果= ");memo = strnet . substring(imemoStart,imemoEnd);result checker result checker = new result checker(strRet);int retVal = result checker . check sign();if (retVal == ResultChecker。RESULT _ CHECK _ SIGN _ FAILED){ base helper . showdialog(mActivity," Prompt ",mactiveness。getresources()。getstring(r . string . check _ sign _ failed),Android . r . drawable . IC _ dialog _ alert);} else { base helper . showdialog(m activity," prompt ",memo,r . drawable . info icon);} } catch(异常e){ e . printstacktrace();Basehelper。Showdialog (Mactiveness," Prompt ",strRet,r . drawable . info icon);} }破;} super . handle message(msg);} catch(Exception e){ e . printstacktrace();} } };//关闭进度条void close progress(){ try { if(mProgress!= null){ mprogress . dissolve();mProgress = null} } catch(异常e){ e . printstacktrace();} } public void pay(){ MobileSecurePayHelper MSP helper = new MobileSecurePayHelper(mActivity);boolean is mobile _ spExist = MSP helper . detect mobile _ sp();如果(!isMobile_spExist)返回;如果(!check info()){ base helper . showdialog(mactiveness," prompt ","缺少合作伙伴或卖家,",r . drawable . info icon);返回;}尝试{ //准备订单信息。string order info = getOrderInfo();string sign type = getSignType();String strsign = sign(signType,order info);strsign = URL encoder . encode(strsign);string info = orderInfo+" & amp;sign = "+" \ "+strsign+" \ "+" & amp;+getSignType();//开始支付。MobileSecurePayer MSP = new MobileSecurePayer();boolean bRet = msp.pay(info,mHandler,AlixId。RQF_PAY,mActivity);if (bRet) { //显示进度条表示我们已经开始支付了。close progress();m progress = base helper . show progress(MAC tiveness,null,“正在支付”,false,true);} else} catch(Exception ex){ Toast . make text(m activity,R.string.remote_call_failed,Toast。LENGTH_SHORT)。show();} } private boolean check info(){ String partner = partner config。合伙人;字符串seller = PartnerConfig。卖家;if(partner = = null | | partner . length()& lt;= 0 | | seller = = null | | seller . length()& lt;= 0)返回false返回true} //获取所选订单信息进行支付。String getOrderInfo(){ String strOrderInfo = " partner = "+" \ "+partner config。合作伙伴+" \ ";strOrderInfo+= " & amp;;strOrderInfo+= " seller = "+" \ "+partner config。卖家+" \ ";strOrderInfo+= " & amp;;strOrderInfo+= " out _ trade _ no = "+" \ "+getOutTradeNo()+" \ ";strOrderInfo+= " & amp;;//交易价格strordeinfo+= " subject = "+" \ "+mactiveness。getString(r . string . donate _ subject)+" \ ";strOrderInfo+= " & amp;;//strode info+= " body = "+" \ "+mactiveness。getString(r . string . donate _ body)+" \ ";strOrderInfo+= " & amp;;//成交价strordeinfo+= " total _ fee = "+" \ "+" 10.00 "+" \ ";strOrderInfo+= " & amp;;strOrderInfo+= " notify _ URL = "+" \ "+" http://notify . Java . jpxx . org/index . JSP "+" \ ";返回strOrderInfo} //获取订单的out_trade_no。string getOutTradeNo(){ simple date format format = new simple date format(" 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);返回strKey} //获取我们使用的符号类型。String get sign type(){ String get sign type = " sign _ type = "+" \ "+" RSA "+" \ ";返回getSignType} //签署订单信息。字符串符号(字符串符号类型,字符串内容){返回Rsa.sign(内容,PartnerConfig。RSA _ PRIVATE);lephone平台的OnCancelListener。静态类AlixOnCancelListener实现DialogInterface。OnCancelListener { Activity m context;AlixOnCancelListener(活动上下文){ mcontext = context} public void on cancel(dialog interface dialog){ m context . onkeydown(key event。KEYCODE_BACK,null);} }}

此类的付款方式是付款方式。如果未设置,调用方法如下:

alix pay alix pay = new alix pay(settingtabactivity . this);alix pay . pay();