有没有可以导入支付宝的记账本和微信支付数据的记账本APP

3038人阅读
从开始学习android开始到现在还没搞过三方支付,感觉挺遗憾的。看到最近有几篇关于微信支付和支付宝支付的文章,稍微进行一下整合,供大家参考。
----------------------------------------------------------微信支付---------------------------------------------------------------
1.申请开发者资质
https://open.
使用公司管理者/高层帐号登录微信开放平台,进入“账号中心”,进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡信息(卡号,发卡行)。审核时间为一周左右。
因为从日起,国家实行三证(组织机构代码证,企业营业执照,税务登记证)合一,所以组织机构代码处填写-工商执照注册号,同样,组织机构代码证,上传-企业工商营业执照。
进行开发者资质认证需要支付300元人名币/年,只有具备开发者资质认证的开发者才能够使用app支付,授权登录等接口。
2.申请APP_ID/APP_KEY
每个应用/游戏要调用微信的接口都需要有一个微信标志,这个唯一标志通常成为
APP_ID 或者
APP_KEY,各开放平台差异不大&。
进入管理中心,创建移动应用,每个开发者具有10个应用的创建机会,好在创建的应用可以随时删除。已上线的应用就不建议手贱删除!!
申请appid需要填写应用信息:应用名称,包名,签名(keystore的md5值去分号小写),icon(28*28 & 108*108),app下载地址等信息,即可分配到一个appid。
测试支付时,务必使用申请时填写的
keystore文件签名,包名也需要核对清楚,必然无法调起支付,返回-1错误码。
3.申请支付能力
在管理中心,查看需要集成支付能力的app,找到“微信支付”一栏,点击右侧“申请开通”,填写一些企业信息后等待审核,审核时间为一周左右,审核通过后,会得到一个企业商户号及密码,对公银行卡中将收到几分钱,进入商户平台,输入收到的金钱金额以验证。验证通过后即可开始集成支付调用。在这之前,调用支付接口是无法完成支付的。
4.代码集成微信支付
支付流程图:
微信支付流程图白话版:
1.客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
// 微信appid,选择性上传,服务器写死亦可params.put(&appid&, appID);// 支付金额,单位:分params.put(&money&, money);// 商品名称params.put(&name&, goodsName);// 支付币种,只能填CNY,代表人民币params.put(&currencytype&, &CNY&);
以上是参数字段是我们公司服务器定义,给服务器用以获取预支付订单号prePayId用。
详细字段请参考:
https://pay./wiki/doc/api/app/app.php?chapter=9_1
2.app服务器调用微信“统一下单”接口,得到
prePayId 订单号并返回
prePayId 给手机客户端;
3.手机客户端使用
prePayId 及商品信息调起微信客户端进行支付;
用户操作:输入密码进行支付;返回键取消支付;网络无连接支付失败等
4.微信客户端回调支付结果给咱们的APP客户端;
5.微信服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)
微信支付代码:
在app包下新建
wxapi包,比如app包名为
com.wxdemo.app,那个新建的包路径为
com.wxdemo.app.wxapi,该包下新建
WXPayEntryActivity,继承自任意Activity。该Activity用以接收支付结果回调,清单声明此Activity的格式为:
& &android:name=&.wxapi.WXPayEntryActivity&
& &android:exported=&true&
& &android:launchMode=&singleTop&/&
WXPayEntryActivity
代码示例:
回调中errCode值列表:
0 :支付成功&。
-1 :发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
用户取消 发生场景:用户不支付了,点击取消,返回APP。
manifest声明所需权限:
&uses-permission android:name=&android.permission.INTERNET& /&&uses-permission android:name=&android.permission.MODIFY_AUDIO_SETTINGS&/&&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE&/&
支付结果最终以app服务器的得到的异步通知为准。
OK 到这我们微信支付就算是搞定了。
附上微信官方支付demo下载:
https://pay./wiki/doc/api/app/app.php?chapter=11_1
吐槽语:官方demo下载藏的有点深。。。开放平台居然没有提供下载,放在微信支付商户平台。
-----------------------------------------------支付宝支付--------------------------------------------------
第一步:签约成为支付宝商户
签约地址:
只有成为签约商户的开发者才能具备集成支付宝app支付的资格。
签约资料:
APP说明文档
商户经营信息、商户联系人等信息
必要时还需
提供APP 以备审核。审核通过后即可进行代码集成。
审核通过后,可得到支付宝分配的
商户号等信息。
第二步:客户端代码集成准备
导入jar包资源
目前最新版支付宝开发jar包下载地址:
http://download.csdn.net/detail/xiong_it/9566771
下载后将之拷贝
libs目录,Eclipse
会自动添加依赖,Android Studio 需在
app的gradle 中添加一行:
compile files('libs/alipaySdk-.jar')
点击右上角:Sync Now,稍等片刻。。。
修改AndroidManifest.xml清单
声明必要Activity:
添加必要权限:
&uses-permission android:name=&android.permission.INTERNET&/&
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE&/&
&uses-permission android:name=&android.permission.ACCESS_WIFI_STATE&/&
&uses-permission android:name=&android.permission.READ_PHONE_STATE&/&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE&/&
添加支付宝混淆规则
第三步:客户端代码集成
支付宝交互流程示意图&
流程图白话版解释:
app携带支付信息调用支付接口请求支付宝客户端调起支付界面;
用户操作,输入密码支付,支付成功;直接返回取消支付;出现错误,支付失败;进入支付界面,但输入密码支付,支付待确认;
支付宝客户端将支付结果告诉app客户端,商户服务器通知app服务器支付结果;
app客户端处理支付结果;
app服务器处理支付结果。
支付宝的支付流程
微信的支付流程图 少了一步app服务器端订单的生成,但是在其demo代码中是推荐使用app服务器进行sign签名过程的,于是笔者索性是按照的微信支付的流程去集成的。
客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:
// 商品金额,单位:元params.put(&money&, payMoney);// 商品名称params.put(&goodsname&, goodsName);
注意:支付宝支付的人民币单位和微信支付,银联支付稍有不同,需以:元 作为支付单位。其他两者支付单位为:分&。其他参数均交给咱们app服务器处理即可,详细参数请点击:
https://doc./doc2/detail?treeId=59&articleId=103663&docType=1
app服务器参考上述详细参数链接,得到sign(支付签名信息)字段并返回sign字段给手机客户端;
手机客户端使用sign签名信息在非UI线程调起支付客户端进行支付;&
用户操作:输入密码进行支付;返回键取消支付;进入支付界面,用户未进行支付,用户返回,待支付;网络无连接支付失败等;
客户端得到支付结果;
支付宝服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)
这样做的好处:签名逻辑在服务器完成,app无需暴露公钥和私钥,更安全。同时也是demo中的推荐做法。
更详细的支付宝接入交互流程解释请点击:
https://doc./doc2/detail.htm?spm=a219a..0.7WO30X&treeId=59&articleId=103658&docType=1
客户端代码示例:
支付调起代码(须在子线程):
支付处理代码(UI线程):
注:AliPayResult.java
来自支付宝demo中的
PayResult.java&。
至此,集成支付宝SDK结束。祝各位集成支付宝支付成功!
按照惯例,附上支付宝SDK接入的官方demo下载链接:
https://doc./doc2/detail.htm?treeId=54&articleId=104509&docType=1
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20036次
排名:千里之外
原创:34篇
(2)(2)(2)(1)(1)(4)(2)(2)(2)(12)(4)(1)(1)(3)支付宝钱包增加记账功能 自动导入支付宝账单
来源:站长之家
大家都知道,支付宝钱包服务窗与微信公众服务号最大的差异是,后者可以对话,前者不可以,但是这个差异现在不存在了,用户订阅支付宝钱包服务窗也可以发送反馈消息了。
支付宝钱包今天更新了8.2版本,新功能主要为两个:第一是服务窗对话功能;第二是记账本功能。
服务窗对话
支付宝钱包增加服务窗对话功能
5月份我曾报道正在内测支付宝服务窗后台(现在竟然还在内测&&),其中一项功能是&消息管理&,当时还没有开放。据了解,现在对话功能已经向所有入驻服务窗的商户开放,商户可以在后台开通。
对话功能的开通,使得支付宝服务窗更加完整,毕竟服务需要反馈。微信公众服务号中很重要的一项功能,关键字触发,或许不久也会出现在支付宝服务窗中。
支付宝钱包增加记账功能
支付宝钱包首页新增了一项内置的记账应用,自动导入支付宝账单,并且区分网购、生活缴费、信用卡还款等类目。当然还可以手动记账。
试用后发现,支付宝记账本并没有区分账目资金来源是使用支付宝、余额宝、银行卡还是现金,只有金额以及消费类别的简单处理。
据了解,以前支付宝账单是开放给挖财、随手记等记账软件的,用户可以导入并自动记账,但是后来支付宝关闭了接口,看来是想自己做。但是现在支付宝记账本功能相对简单,未来支付宝在这方面花精力完善,可能会对记账软件带去一定的竞争压力。
原标题:支付宝钱包版本更新:增服务窗对话与记账功能
编辑:孙敏
[此文系转载,来源于站长之家,版权归属原作者]
万家理财频道官方公众号微信号:合肥孔方兄
扫二维码,用手机看,每天都有精彩!
4677人关注
春天应该带着宝宝们做一些什么有意思的事情呢?
2016合肥购房者遭遇了最难的一年,房价暴涨、摇号作假...
当春姑娘的脚步近了,在岳西天峡的山野田园间,和孩子...
合肥共享单车生存调查。进肥1个月千余辆小黄车受伤。管好、用好共享单车, ...
短信快捷登录
合作账号登录
验证即登录,未注册将自动创建万家账号
发送验证码iOS 支付 [支付宝、银联、微信]
招聘信息:
作者: 授权本站转载。这是开头语前不久做了一个项目,涉及到支付宝和银联支付,支付宝和银联都是业界的老大哥,文档、SDK都是很屌,屌的找不到,屌的看不懂,屌到没朋友(吐槽而已),本文将涉及到的最新可用SDK、文档,以及本人支付遇到的一些坑标记一下。资料 //文档idk都包含了安卓、iOS版Demo给了一个订单号,做测试使用,若出现支付失败什么的,可能是已经被别人给支付了,或者是服务器订单过期了 ~一、支付宝1.1 请阅读支付宝文档和Demo1.2 导入对应的库将支付宝Demo中得这些东西全拷贝过来localhost:alipay&mac$&ls
APAuthV2Info.h&&&&&&&&Order.h&&&&&&&&&&&&libssl.a
APAuthV2Info.m&&&&&&&&Order.m&&&&&&&&&&&&openssl
AlipaySDK.bundle&&&&Util
AlipaySDK.framework&&&&libcrypto.a导入系统库SystemConfiguration.framework设置一下search pathsbuild&setting&->搜索search&path,然后你懂的完成后,编译一下,看有没有错,有错没错,还是下一步吧。1.3 对接支付宝对节前,你还是需要从服务器拿到一下一堆东西支付宝接口文档中写了3p参数列表,--! 总结下我用的到,或者说是Demo中提到的,别的就超出范围了合作者身份ID&&&&&alipayPartner&=&@"2088一串数字";
接口名称&&&&&&&&&&&&&alipaySeller&=&@"";
签名&&&&&&&&&&&&&&&&aliPayPrivateKey&=&@"很长很长的私钥";
//公钥&&&&&&&&&&&&alipayRSA_PUBLIC=@"一般长";&&客户端不用服务器都给我了--~!
服务器异步通知页面路径&&alipayNotifServerURL&=&@"一个网址";&//支付结果,支付宝会通知服务器其他一些参数(与购买产品相关,设计到业务了,客户端/服务器谁提供均可)直接贴order代码了,具体看我的Demo示例.Order&\*order&=&[[Order&alloc]&init];
&&&&&&&&&&&&&&&&&&&&order.partner&=&alipayPartner&;
&&&&&&&&&&&&&&&&&&&&order.seller&=&alipayS
&&&&&&&&&&&&&&&&&&&&order.tradeNO&=&&//订单ID(由商家自行制定)
&&&&&&&&&&&&&&&&&&&&order.productName&=&[NSString&stringWithFormat:@"汽车服务充值-%@",@"支付"];&//商品标题
&&&&&&&&&&&&&&&&&&&&order.productDescription&=&[NSString&stringWithFormat:@"%@:支付宝移动支付充值",@"xxxx"];&//商品描述
&&&&&&&&&&&&&&&&&&&&order.amount&=&_txtCNY.&//商品价格
&&&&&&&&&&&&&&&&&&&&order.notifyURL&=&&alipayNotifServerURL;&//回调URL
&&&&&&&&&&&&&&&&&&&&order.service&=&@"mobile.securitypay.pay";
&&&&&&&&&&&&&&&&&&&&order.paymentType&=&@"1";
&&&&&&&&&&&&&&&&&&&&order.inputCharset&=&@"utf-8";
&&&&&&&&&&&&&&&&&&&&order.itBPay&=&@"30m";
&&&&&&&&&&&&&&&&&&&&order.showUrl&=&@"";
&&&&&&&&&&&&&&&&&&&&//应用注册scheme,在AlixPayDemo-Info.plist定义URL&types
&&&&&&&&&&&&&&&&&&&&NSString&*appScheme&=&URLS调用支付宝[[AlipaySDK&defaultService]&payOrder:orderString&fromScheme:appScheme&callback:^(NSDictionary&*resultDic)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"reslut&=&%@",resultDic);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&([resultDic[@"resultStatus"]&intValue]==9000)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//进入充值列表页面
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"支付成功");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&else{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSString&*resultMes&=&resultDic[@"memo"];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&resultMes&=&(resultMes.length<=0?@"支付失败":resultMes);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"%@",resultMes);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&}];你可能会发现回调不行->设置回调shema//上面支付时已经传给了支付宝客户端回调shema名称
&NSString&*appScheme&=&URLS
&//具体设置shema方法此处就不再累赘,这儿需要处理来自支付宝shema回调,才能完成上面方法的block回调
&在APPDelegate&-
&&-&(BOOL)application:(UIApplication&*)application
&&&&&&&&&&&&openURL:(NSURL&*)url
&&sourceApplication:(NSString&*)sourceApplication
&&&&&&&&&annotation:(id)annotation&{
&&&&&&&&&//跳转支付宝钱包进行支付,处理支付结果
&&&&[[AlipaySDK&defaultService]&processOrderWithPaymentResult:url&standbyCallback:^(NSDictionary&*resultDic)&{
&&&&&&&&NSLog(@"result&=&%@",resultDic);
&&&&return&YES;
}二、银联2.1 请去看银联文档和demo2.2 导入对应的库SDK说明SDK分为以下两个版本:① & &支持纯无卡交易静态库,以下简称UPPayPlugin,包含文件:UPPayPlugin.h
UPPayPluginDelegate.h
libUPPayPlugin.a② & &支持纯无卡交易和VIPOS音频口支付静态库,以下简称UPPayPluginPro,包含文件:UPPayPluginPro.h
UPPayPluginDelegate.h
libUPPayPluginPro.a大概这两个库就是上述那样(嗯,装懂了),具体问商务/后者后台,我们只需要知道②需要将.m改成.mm (应该是用c++封装的音频...??)添加SDK包a) & &根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到UPPayDemo工程中;b) & &如果你选择的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;c) & &如果你选择的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;d) & &在工程的Build Settings中找到Other Linker Flags中添加-ObjC宏;导入到工程,让服务器准备一下交易流水号信息 (什么他们不懂,让他们去看文档 ),休息一下,喝杯什么好了2.3 对接咱们的服务器也是挺给力的,一盏茶的功夫,就将交易流水号信息 给准备好了,嗯不错,速度对接一下。&+&(BOOL)startPay:(NSString*)tn&
mode:(NSString*)mode&
viewController:(UIViewController*)viewController&
delegate:(id)-------------参数说明(必填)-------------------tn&&&&&&&&&&&&&&&&&NSString*&&&&&&&&&&&&&&&&&&&交易流水号信息,银联后台生成,通过商户后台返回到客户端并传入支付控件;&
mode&&&&&&&&&&&&NSString*&&&&&&&&&&&&&&&&&接入模式设定,两个值:@"00":代表接入生产环境(正式版本需要);@"01":代表接入开发测试环境(测试版本需要);
viewController&&&&UIViewController*&&&&&&&&&&商户应用程序调用银联手机支付的当前UIViewController;
delegate&&&&&&&&id&&&&&实现UPPayPluginDelegate方法的UIViewController;嗯,这些都是文档中的,请仔细看看[上线的时候一定药修改mode模式]。mode在测试环境下可以银联给的测试号 tn=@"01" 测试环境测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)招商银行预付费卡:卡号:45 6785密码:111101[这个居然无效]再来一个:银行卡号:0000018身份证号:218366手 机 号 :验 证 码 :123456 【要点击获取验证码,不然提交会报错】viewcontroller需要干这些事情*引入头文件&&\#import&"UPPayPluginPro.h"
&&&&&&&&[UPPayPluginPro&startPay:tn&mode:self.tnMode&viewController:self&delegate:self];
*实现对应代理方法
&&&&&&&&\#pragma&mark&UPPayPluginResult
&&&&&&&&-&(void)UPPayPluginResult:(NSString&\*)result
&&&&&&&&&&&&NSString\*&msg&=&[NSString&stringWithFormat:@"%@",&result];
&&&&&&&&&&&&NSLog(@"msg%@",msg);
&&&&&&&&&&&&if&([result&isEqualToString:@"msgcancel"])&{
&&&&&&&&&&&&&&&&NSLog(@"取消银联支付...");
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if([result&containsString:@"success"]){
&&&&&&&&&&&&&&&&NSLog(@"支付成功");
&&&&&&&&&&&&}
&&&&&&}微信支付总体来说微信支付需要审核的比较麻烦,我也没有去弄一个号亲自测试一下,按照文档demo去走一般不会出什么问题。小记可能遇到银联c++编译问题,把对应的viewcontroller切换成.mm,编译看看。若有CreateRSADataSigner arm64的,请将支付宝给的DataSigner改成.mm即可。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量8928点击量6553点击量6059点击量4934点击量4070点击量3732点击量3251点击量2987点击量2917
&2016 Chukong Technologies,Inc.
京公网安备89Android微信支付和支付宝支付服务端操作放到客户端
现在的APP大部分需要接入支付功能,而支付的主流就是微信支付和支付宝支付,网上关于微信支付和支付支付资料很多,但是这些资料随着官方的变动可能变得毫无用处,所以我建议直接看官方文档,微信开放平台和支付宝开放平台。当然,一般官方不会闲的蛋疼随便改,大的改动周期在2年左右,小的改动不会有太大影响,所以,如果你不习惯官方的文档,那么你找的资料的新鲜度很重要。因为本文主要目的是介绍服务端的一些操作放到客户端,所以正常的接入就不重复造轮子了&。
相信很多同学看到标题就有疑问了,为什么要将服务端的一些操作放到客户端来?放到客户端不安全,官方不是不推荐吗?我也想啊,为什么非要给自己制造麻烦,但是,我一个项目(外包)遇到了这样的情况,这个项目做服务端告诉他不会集成,让我放到客户端来,当时也解释了利害关系,但是对方执意如此。在此,我只想说&&(此处省略一万字),这里我笑了,不会集成?那支付后那些回调操作你怎么要做了?为什么不也放到客户端来?哦,对了,客户端不方便修改数据。请原谅我的吐槽,这根本不是会不会集成的原因,这是态度问题啊,相信有很多同学遇到过类似的事情,在这里还是希望大家吐槽可以,忍忍也就过去了。好像扯远了,回归正题吧。
支付宝服务端sign签名
首先我们有必要来看一下支付宝支付的流程图,以便了解服务端该做哪些操作:
注意第一点app携带支付信息(正常的流程这里服务端有一个签名过程,APP需要请求服务端提供的接口传入对应的参数获取签名后的数据,本文将服务端签名过程放到客户端)调用支付接口请求支付宝客户端调起支付界面。流程图其他步骤可以参考前言中推荐的文章,里面有详细的解释,这里不再解释了。
支付宝签名支付宝签名文档,其实,支付宝的集成很简单,所以签名也很简单,对照文档一会儿就弄出来了,我们来看一看就明白了:
* 获取签名
public static String getSign(String content, String privateKey) {
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
KeyFactory keyf = KeyFactory.getInstance(&RSA&);
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
java.security.Signature signature = java.security.Signature.getInstance(&SHA1WithRSA&);
signature.initSign(priKey);
signature.update(content.getBytes(&UTF-8&));
byte[] signed = signature.sign();
return Base64.encode(signed);
} catch (Exception e) {
e.printStackTrace();
* 创建订单信息
* @param payEntity 订单支付实体
private static String getOrderInfo(PayEntity payEntity){
StringBuffer orderInfo = new StringBuffer();
// 签约合作者身份ID
orderInfo.append(&partner=& + &\&& + AliPayConstans.PARTNER + &\&&);
// 签约卖家支付宝账号
orderInfo.append(&&seller_id=& + &\&& + AliPayConstans.SELLER + &\&&);
// 商户网站唯一订单号
orderInfo.append(&&out_trade_no=& + &\&& + payEntity.getOut_trade_no() + &\&&);
// 商品名称
orderInfo.append(&&subject=& + &\&& + payEntity.getSubject() + &\&&);
// 商品详情
orderInfo.append(&&body=& + &\&& + payEntity.getBody() + &\&&);
// 商品金额
orderInfo.append(&&total_fee=& + &\&& + payEntity.getTotal_fee() + &\&&);
// 服务器异步通知页面路径
orderInfo.append(&&ify_url=& + &\&& + AliPayConstans.NOTIFY_URL
// 服务接口名称, 固定值
orderInfo.append(&&service=\&mobile.securitypay.pay\&&);
// 支付类型, 固定值
orderInfo.append(&&payment_type=\&1\&&);
// 参数编码, 固定值
orderInfo.append(&&_input_charset=\&utf-8\&&);
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo.append(&&it_b_pay=\&30m\&&);
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += &&extern_token=& + &\&& + extern_token + &\&&;
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo.append(&&return_url=\&\&&);
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += &&paymethod=\&expressGateway\&&;
return orderInfo.toString();
AliPayConstans相关:
/** 商户PID */
public static final String PARTNER = &&;
/** 商户收款账号 */
public static final String SELLER = &&;
/** 商户私钥,pkcs8格式 */
public static final String RSA_PRIVATE = &&;
/** 支付宝公钥 */
public static final String RSA_PUBLIC = &&;
/** 支付回调接口,需要服务器端支持 */
public static final String NOTIFY_URL = &&;
微信服务端统一下单及签名
老规矩先看微信支付流程图,不得不说微信支付的流程还挺复杂的,这也许是大家吐槽微信支付的原因之一吧:
vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="hljs java">我们需要注意2-7之间的步骤,这是关键所在,其中会有两次签名。
1. 构建支付订单信息(第一次签名)
2. 调用统一下单接口获取预付ID(prepay_id)
3. 生成带签名的客户端支付信息(第二次签名)
1、构建支付订单信息
* 微信支付,构建统一下单请求参数
public String genEntity() {
String nonceStr = genNonceStr();
List packageParams = new ArrayList();
packageParams
.add(new BasicNameValuePair(&appid&, WeChatConstans.APP_ID));
// 商品描述
packageParams.add(new BasicNameValuePair(&body&, body));
packageParams.add(new BasicNameValuePair(&mch_id&,
WeChatConstans.PARTNER_ID));
// 随机字符串
packageParams.add(new BasicNameValuePair(&nonce_str&, nonceStr));
// 回调接口地址
packageParams.add(new BasicNameValuePair(&notify_url&,
WeChatConstans.NOTIFY_URL));
// 我们的订单号
packageParams.add(new BasicNameValuePair(&out_trade_no&, out_trade_no));
// 提交用户端ip
packageParams.add(new BasicNameValuePair(&spbill_create_ip&,
getIPAddress()));
BigDecimal totalFeeBig = new BigDecimal(total_fee);
int totalFee = totalFeeBig.multiply(new BigDecimal(100)).intValue();
// 总金额,单位为 分 !
packageParams.add(new BasicNameValuePair(&total_fee&, String
.valueOf(totalFee)));
// 支付类型, APP
packageParams.add(new BasicNameValuePair(&trade_type&, &APP&));
// 生成签名
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair(&sign&, sign));
String xmlstring = XmlUtil.toXml(packageParams);
//避免商品描述中文字符编码格式造成支付失败
return new String(xmlstring.toString().getBytes(), &ISO-8859-1&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
生成签名:
* 生成签名
public static String genPackageSign(List params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append(&#39;=&#39;);
sb.append(params.get(i).getValue());
sb.append(&#39;&&#39;);
sb.append(&key=&);
sb.append(WeChatConstans.PARTNER_KEY);
String packageSign = MD5Util.getMessageDigest(
sb.toString().getBytes(&utf-8&)).toUpperCase();
return packageS
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
随机字符串:
* 微信支付调用统一下单接口,随机字符串
public static String genNonceStr() {
Random random = new Random();
String rStr = MD5Util.getMessageDigest(String.valueOf(
random.nextInt(10000)).getBytes(&utf-8&));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
因为微信接收参数的格式只支持xml格式,所以我们要将参数转为xml格式,具体参照 接口,生成xml格式:
* 生成 XML
public static String toXml(List params) {
StringBuilder sb = new StringBuilder();
sb.append(&&);
for (int i = 0; i & params.size(); i++) {
sb.append(&&& + params.get(i).getName() + &&&);
sb.append(params.get(i).getValue());
sb.append(&&);
sb.append(&&);
return sb.toString();
2、调用统一下单接口获取预付ID
将我们第一步构建支付订单信息作为参数请求统一下单接口:
* 异步网络请求获取预付Id
private class GetPrepayIdTask extends AsyncTask {
protected void onPreExecute() {
protected void onPostExecute(String result) {
// 第三步, 发送支付请求
sendPayReq(result);
protected String doInBackground(String... params) {
// 网络请求获取预付Id
String url = String.format(WeChatConstans.WECHAT_UNIFIED_ORDER);
String entity = genEntity();
byte[] buf = WeChatHttpClient.httpPost(url, entity);
if (buf != null && buf.length & 0) {
Map map = XmlUtil.doXMLParse(new String(buf));
return (String) map.get(&prepay_id&);
} catch (Exception e) {
e.printStackTrace();
由于返回的参数格式是xml格式,所以我们要解析数据,获取prepay_id:
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @throws JDOMException
* @throws IOException
public static Map doXMLParse(String strxml) throws Exception {
if (null == strxml || &&.equals(strxml)) {
Map m = new HashMap();
InputStream in = new ByteArrayInputStream(strxml.getBytes());
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = &&;
List children = e.getChildren();
if (children.isEmpty()) {
v = e.getTextNormalize();
v = getChildrenText(children);
m.put(k, v);
in.close();
* 获取子结点的xml
* @param children
* @return String
public static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if (!children.isEmpty()) {
Iterator it = children.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append(&&& + name + &&&);
if (!list.isEmpty()) {
sb.append(getChildrenText(list));
sb.append(value);
sb.append(&&);
return sb.toString();
* 3、生成带签名的客户端支付信息(直接调起支付)*
* 发送支付请求
* @param prepayId 预付Id
private void sendPayReq(String prepayId) {
PayReq req = new PayReq();
req.appId = WeChatConstans.APP_ID;
req.partnerId = WeChatConstans.PARTNER_ID;
req.prepayId = prepayId;
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
req.packageValue = &Sign=WXPay&;
List signParams = new LinkedList();
signParams.add(new BasicNameValuePair(&appid&, req.appId));
signParams.add(new BasicNameValuePair(&noncestr&, req.nonceStr));
signParams.add(new BasicNameValuePair(&package&, req.packageValue));
signParams.add(new BasicNameValuePair(&partnerid&, req.partnerId));
signParams.add(new BasicNameValuePair(&prepayid&, req.prepayId));
signParams.add(new BasicNameValuePair(&timestamp&, req.timeStamp));
//再次签名
req.sign = genPackageSign(signParams);
// 传递的额外信息,字符串信息,自定义格式
// req.extData = type +&#& + out_trade_no + &#& +total_
// 微信支付结果界面对调起支付Activity的处理
// APPCache.payActivity.put(&调起支付的Activity&,(调起支付的Activity)context);
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.registerApp(WeChatConstans.APP_ID);
api.sendReq(req);
// 支付完成后微信会回调 wxapi包下 WXPayEntryActivity 的public void onResp(BaseResp
// resp)方法,所以后续操作,放在这个回调函数中操作就可以了
微信支付成功调起支付后回调到WXPayEntryActivity就是正常微信支付流程了。
文章重点介绍了微信支付服务端操作放到客户端而支付宝的服务端操作比较简单,由于篇幅原因,所以只贴了部分关键代码,下面会给出模板demo(Eclispce和Studio都有),Demo不能直接调起支付,但是替换为具体项目非常方便。通过本文可以了解到,其实不管客户端还是服务端,只要按照官方文档来做,一般还是能实现的,不过官方文档也有不足的地方,文档排版不好、内容混杂、文档更新不及时、demo杂而乱(PS:这里只觉得微信demo太杂太乱了)。但是,只要你用心,这些都不是问题。
如果&&有同学遇到服务端蛮不讲理的把这些操作丢给你,你可以和他理论一番,他改正也就好了,如果还是一意孤心,你还是忍忍吧&&毕竟,你要做一个大度的人,哈哈哈!
The good seaman is known in bad weather.
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 支付宝的记账本 的文章

 

随机推荐