在现在的商业app开发中,基本上都会用到支付功能,如微信,支付宝等待,网络上此类的文章很多,下面就我工作中实际用到的给那些刚刚使用支付功能的朋友一些经验,非demo;
在开发支付模块之前我们要思考下:
1.支付模块应该是属于公共模块,也就是说应该是 独立与app 主要业务逻辑之外的,他只提供支付即可,(独立)
2.支付成功后应该有返回响应,支付平台何其多,每一次都写返回,提示,浪费精力也容易出错,不规整(响应)
3.当app不断迭代之后,代码量上来了,万一支付sdk升级,开发文档不完整(一般公司都是补开发文档),员工离职,等待情况,维护成本增大;(维护升级)
...
针对上述的3种情况,支付模块可以做:
1.独立于工程之外,以后只要用到支付功能 直接导入库工程然后调用api即可实现支付,可以单独新建一个库工程(不是仅仅建一个包)
2.在库工程中把每一个平台的支付代码,新建一个包
3.资源文件建议,已加标示,方便维护,比方,支付宝的 string 可以写成,alipay_strings.xml,,里面的值也以alipay开头,虽然多写string 麻烦,但是好辨识 以后不爽的时候也可以看着修改,方便自己也方便他人!
下图是我常用 的工程目录(每一个应用差不多 ,比方说环信模块,页面和逻辑数据库,等都不和主模块耦合,需要就调用,具体逻辑在相应模块中自行处理,比如,聊天中中要发红包,这是聊天的事和主逻辑无关,发完后 告诉一声就可以了 (可以用回调,也可以用事件订阅))
下面开始支付宝支付(亮点都打了码):
1.打开支付宝网站,签约支付宝账号,下载相应的sdk
忘记密码汗!了 引用一张官方网站的
这样下载的sdk中的keys.java的参数都有了
以上的 是Keys的参数的来源,一般来说,公司会提供,自己开发的话需要看一下费率(支付宝是要收手续费的)
http://fun.alipay.com/qyfl/index.htm
(注:微信支付认证的话 是300元一年)
2.支付需要的参数以及调用的方法
上一节我们拿到了支付所需要的参数,下面我们详细介绍支付的步骤;
直接上代码
public abstract class BaseAliPay implements Define_pay { public Context context; public PayCallBack payCallBack;
/** 支付宝支付的实际操作方法 */ protected void payToAli(final String orderInfo) { new Thread() { @Override public void run() { AliPay alipay = new AliPay((Activity) context, mHandler); // 设置为沙箱模式,不设置默认为线上环境 // alipay.setSandBox(true); String result = ""; String m_OrderInfoString = ""; m_OrderInfoString = orderInfo; try { result = alipay.pay(m_OrderInfoString); } catch (Exception e) { e.printStackTrace(); } if (result.equals("")) { Message msg = new Message(); msg.what = 6; mHandler2.sendMessage(msg); } else { Message msg = new Message(); msg.what = 5; msg.obj = result; mHandler2.sendMessage(msg); } } }.start(); }
这个是实际代码的中的支付部分,支付其实只需要把支付的信息(多少钱,订单号等)传递过来,然后调用alipay(携带支付的信息)就ok了,返回result我们可以在handler中处理就行,
所以整支付只要把支付的信息弄正确就ok了,其他问题比较少了(相对于微信支付来说 ,简单的多,)
这里注意,科普一下:
1.支付宝只针对签约商家,只要你签约ok,拿到了可以中所需要的参数 pid 用户名,公钥私钥,而且都没过期,那么无论你开发啥app,多少个app 都可以用这个账户,钱都是网这个账户中流入
2.微信就不一样,微信必须签约支付产品获得支付功能权限,而且认证一次300老毛头没年,一个软件需要一次认证,后面在android支付之微信支付(二)中有具体介绍
摘自官网:
确定要传递给支付宝的参数
1、这些参数怎么来的?
每个接口对应一个接口技术文档,文档中提到的请求参数,就是可以选择要传递的参数。2、怎么确定这些参数?
1)基本参数
partner、_input_charset、sign、sign_type、service这些属于基本参数,是必须要传递的参数。
2)业务参数
①在接口技术文档的请求参数列表中,不可空的参数是必须要传递的参数。
如:即时到账中total_fee、subject、out_trade_no等
②根据商户自身的业务需求或根据支付宝接口对应的特殊业务规则,有些参数也是需要传递过来的
如:即时到账中如果开通了防钓鱼策略,那么anti_phishing_key、exter_invoke_ip必须传递
上面这是官网上说的,还没集成过支付的朋友,可能不是很明白意思,下面看到截图就ok了
每一个接口的意思是:在签约平台上 根据不同的签约产品如 及时支付,移动支付,网页支付等等(支付宝分的很细),他提交的参数都不一样,不过差不多;
一般他都分为基本参数和业务参数
如:http://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103740&docType=1
举例说明,上代码:
/** * 获得支付产品的信息 * @param orderId 商户网站唯一订单号----支付宝合作商户网站唯一订单号 * @param mPayMoneyString 支付的金额----可以算也可以后台返回(该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位) * @param subject---商品名称(不可少)商品的标题/交易标题/订单标题/订单关键字等。但是不能过长,不能大于128个汉字 * @param body//商品描述,对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body * @param notify_url//服务器异步通知页面路径,就是说你支付成功了,得告诉后台,喂,哥们,xx付款了,你可以更改支付状态了(否则,就是给了钱,商家不知道,不会发货的,哈哈) * @param return_url//页面跳转同步通知页面路径,跳转页面 * @return */ public String getNewOrderInfoForAlipay(String orderId, String mPayMoneyString, String subject, String body, String notify_url, String return_url) { StringBuilder sb = new StringBuilder(); sb.append("partner=\"");//合作者身份ID 不可少 sb.append(Keys.DEFAULT_PARTNER); sb.append("\"&out_trade_no=\""); sb.append(orderId); sb.append("\"&subject=\""); sb.append(subject); sb.append("\"&body=\""); sb.append(body); sb.append("\"&total_fee=\""); sb.append(String.valueOf(mPayMoneyString)); sb.append("\"¬ify_url=\""); // 网址需要做URL编码 sb.append(URLEncoder.encode(notify_url));//服务器异步通知页面路径 支付宝服务器主动通知商户网站里指定的页面http路径 sb.append("\"&service=\"mobile.securitypay.pay");//接口名称 你签约的产品
这里就是快捷支付的接口参数,我已经签约了这个产品(截图) sb.append("\"&_input_charset=\"UTF-8");//参数编码字符集 (不可少)商户网站使用的编码格式,如utf-8、gbk、gb2312等。 sb.append("\"&return_url=\""); sb.append(URLEncoder.encode(return_url)); sb.append("\"&payment_type=\"1");//支付类型 一般的话都是1,表示商品购买 sb.append("\"&seller_id=\""); sb.append(Keys.DEFAULT_SELLER);//支付宝的用户号 // 如果show_url值为空,可不传 // sb.append("\"&show_url=\""); sb.append("\"&it_b_pay=\"1m");//超时时间,设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭。m表示分钟,d天 h小时 sb.append("\""); return new String(sb); }上面黑色部分的代码说的非常详细了
准备好上述参数后,调用alipay.pay(信息)就ok了,然后再handler中处理返回;
支付宝支付小结:
1.注册支付宝账号,签约需要产品获得(支付宝账号,支付宝pid 公钥 秘钥)------公司开发的话 注意选择费率(有包年和按单结算 )
2.根据签约的产品,获得相应开发文档,然后组合接口所需的参数(基本参数和业务参数)后调用,pay提交,支付结果再handler处理
3.支付宝支付是和账户有关,与app包名无关,一个支付宝账号可以用于多个app支付(区别于微信支付),因此eclipse或者androidstudio默认签名的app也可以支付(微信首次可以,第二次会报错)
4.支付宝支付过程中,会提示安装支付宝支付控件,在填写用户名和密码支付后,发现还是无法支付,这是因为支付宝要和银行卡绑定才能完成支付(此处之前被折腾死去活来,过后和测试吐槽说支付宝垃圾,她说之前把它解除绑定了,当时哥脸都黑了)