为了让各位程序猿们更高效接入、使用及快速解决支付问题。贴上自己对Android中使用第三方支付宝、微信支付一点见解~
1.微信支付
以下是微信支付交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。PS:看懂此图,即对微信支付的认知已达大成之境。
1.1.1 接入
第一步 》》 在微信开放平台创建应用。
首先打开并登录微信开放平台https://open.weixin.qq.com/,选中创建移动应用,根据要求填写,如图:
(一)
此处注意应用签名必须是应用打包时秘钥文件的签名
最后点击提交审核。
创建的应用,可以在管理中心看到,点击可产看查看创建应用的当前状态。若审核通过可看到应用AppID等信息。:
审核通过后,此时尚没有获得微信支付接口,要获得微信接口需开发者认证,认证需要300RMB,认证审核成功后方才可以获取微信支付接口。
第二步 》》将微信支付sdk接入开发的应用中。
进入“资源中心”下载微信支付sdk及微信支付实例。将微信支付jar包libammsdk.jar放入项目lib文件中,然后右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件
并且在androidmanifest.xml文件中配置微信支付参数,要保证回调类WXPayEntryActivity.java文件必须位于包名的wxapi目录下,否则会导致无法回调的情况。
至此微信支付接入完成
1.2 使用
第一步 》》注册微信API, ”AppID”为在微信开放平台创建应用审核成功后,微信分配的AppID.
第二步 》》在此粘贴处微信支付核心调用代码:
1.3 注意事项
1、 包名和开放平台一致,签名和开放平台一致。包名从androidmanifest.xml文件中复制即可。签名可通过微信官方获取生成工具来获取。
2、 若应用包名修改,那么微信开放平台签名必须要随之更改,否则将支付失败。此时微信因为缓存原因,可能会导致签名更正后,应用使用微信支付仍然失败。此时应该清除微信缓存或者卸载掉微信应用后重新安装,然后再尝试支付可成功付款。
3、 必须在包名目录下要有wxapi这个包名,同时必须有wxPayEntryactivity这个类名,否则无法调起微信支付。
2.支付宝支付
以下是支付宝支付交互流程,相比较微信而言,简直So easy!
2.1 接入
直接在支付宝开放平台下载支付宝SDK, 下载地址https://openhome.alipay.com/。
将将支付宝支付jar包alipaySDK.jar放入项目lib文件中,然后右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件
2.2 使用
支付宝无需其他操作,直接使用,贴出核心代码:
/**
*向支付宝发起支付请求
*/
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(this);
// 调用支付接口,获取支付结果
String result = alipay.pay(getZFbPayReq(“应用名”,“订单号”,“商店名”,“支付总价格”));
//此处需要Handler来处理支付回调
Message message = mHandler.obtainMessage();
message.obj = result;
message.what = ZHIFUBAO_CALL_NOTIFY;
mHandler.sendMessage(message);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
/**
*支付宝所需支付参数
*/
public static String getZFbPayReq(String subject, String orderId, String body, String price) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + AppConfig.PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + AppConfig.SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + orderId + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
// orderInfo += "¬ify_url=" + "\"" + "http://notify.msp.hk/notify.htm"+ "\"";
orderInfo += "¬ify_url=" + "\"" + AppConfig.BASE_URL + "notify/alipay"
+ "\"";
// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";
// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
// 对订单做RSA 签名
String sign = SignUtils.sign(orderInfo, AppConfig.RSA_PRIVATE);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "utf-8");
Log.i("-----sign-2", sign + "");
} catch (Exception e) {
e.printStackTrace();
}
String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
return payInfo;
}
/**
* 支付宝 get the sign type we use. 获取签名方式
*/
private static String getSignType() {
return "sign_type=\"RSA\"";
}