首页 > 代码库 > 支付宝支付总结
支付宝支付总结
SDK接入总流程:
检查是否有支付宝钱包,如果有则直接调取,没有安装快捷支付,安装后再,以后直接调取快捷支付,而不是支付宝钱包;
1:前期配置准备工作(支付宝的资料没有放在官方网站里面,而是在支付宝开发文档论坛中,自己去查找获取)
RSA密钥使用逻辑:商户在使用RSA签名方式的支付宝接口时,真正会用到的密钥是商户私钥与支付宝公钥。商户上传公钥给支付宝,支付宝把公钥给商户,是公钥互换的操作。这就使得商户使用自己的私钥做签名时,支付宝端会根据商户上传的公钥做验证签名。商户使用支付宝公钥做验证签名时,同理,也是因为支付宝用支付宝私钥做了签名。
(1)获取公钥和私钥:
RSA密钥生成命令生成RSA私钥openssl>genrsa -out rsa_private_key_samy.pem 1024生成RSA公钥openssl>rsa -in rsa_private_key_samy.pem -pubout -out rsa_public_key_samy.pem将RSA私钥转换成PKCS8格式openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key_samy.pem -outform PEM -nocrypt(ps:这个在客户端本地用必须配置用PKCS8格式的,服务器端直接存放RSA公钥和私钥就可以啦)配置网站后台端:(2):把配置好的公私钥放入代码中集成:/*** @description:* 请参考 Android平台安全支付服务(msp)应用开发接口(4.2 RSA算法签名)部分,并使用压缩包中的openssl RSA密钥生成工具,生成一套RSA公私钥。* 这里签名时,只需要使用生成的RSA私钥。* Note: 为安全起见,使用RSA私钥进行签名的操作过程,应该尽量放到商家服务器端去进行。* @author samy* @date 2014年10月19日 下午12:00:55*/public final class Keys {// 合作身份者id,以2088开头的16位纯数字public static final String DEFAULT_PARTNER = "******411130864349;// 收款支付宝账号public static final String DEFAULT_SELLER = "2356904015@qq.com";// 商户私钥,自助生成public static final String PRIVATE = "*****MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOXBQIVlU3ji6upHs6Qmh+upBmK2kJ9j8UViV07jhql9SBJnnUg28evTKop02vGrtkd2P0pxxbyME6Pp3klFblxM6fzicg3Vx1hVZAxzTB2mE0hSjtQ5gNzPs0DHTCFFcfooXkK8TqpncEWamMJ4ISd9gi+PPhmDIgc7Y7q8yBuxAgMBAAECgYAnajbSa6adR3h7hp932rBYql+REbbP0Upz18IYo4nXi8mQdrwRxnNMPKbAp/ljmkykB9IlyEze4rz/0sAym7mpwr3D4yi3ZSvA7TG7h4d+LcmCvgRNjl2UUj4719aBNN56xDN+740VI6pFNFObt/A3itg9XswctA/t4ANckNnq0QJBAPlVvxcFtjoTOR6hL7OLRjmnEMcG2tyHsydLxGcyFndAOrLhaHnk24LM/Oi81C/uEV9R7oEDOd0RiaB29fpoP3UCQQDr5YPWBSj0o4VE3Qfv7vrHTcMFNiY/9ioMiGitjnClWkN2WNPn1b5kDEFfQTt1fXD9kH8xfUI81MRf8ibegb/NAkB3hZssthg8jqp6/FmZf9ISIPvx7F9OB97hn3hu35vVXnzE8zjZ9dMkSI+UIbC1qTG6t9PVFG7Qgm+u9FfFyeNhAkAKO7OjZifnrOxMF3aPrwNMABCUukugfLJIRuabmNFEKw1AJgxTQ092EZ4IXtEQgLeVGF6cK/3im6xFKUEMZ/6FAkBGzmn/jabnMfpvi/sCSGudlKrDb778tcxUAbQZX3zwUn1LoZBAc0k6fqxtPHZIlbGLuvEGi1Yi1kRxqGbDMe32************************";public static final String PUBLIC = "*******MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB*******************";}
2:代码整合:
(1):
<!-- 支付部分 -->
<activity
android:name="com.unionpay.uppay.PayActivity"
android:configChanges="orientation|keyboardHidden"
android:excludeFromRecents="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" >
</activity>
<activity
android:name="com.alipay.android.app.sdk.WapPayActivity"
android:screenOrientation="portrait" >
</activity> ResourceMap 文件:这个文件必须放在package com.alipay.android.app.lib;否则alipay.jar会反射找不到文件配置和支付宝加载的界面;
(2):
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Result result = new Result((String) msg.obj);
switch (msg.what) {
case RQF_LOGIN:
case RQF_PAY:
Toast.makeText(ExternalPartnerAct.this, result.parseResult(), Toast.LENGTH_SHORT).show();
break;
}
};
};
/**
* @description:直接调取支付宝
* @author samy
* @date 2014年10月16日 下午7:16:20
*/
private void payByZFBLocal() {
final String orderInfo = Result.getNewOrderInfo(orderId, shopItemBean.merchantName, tempNeedPrice >= 0 ? tempNeedPrice + "" : (-tempNeedPrice) + "");
new Thread() {
public void run() {
AliPay alipay = new AliPay(aty, mHandler);
// 设置为沙箱模式,不设置默认为线上环境;从这里开始跳转到支付宝界面;运行完支付pay()后回调;
// alipay.setSandBox(true);
String result = alipay.pay(orderInfo);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);
}
}.start();
}
/**
* @description:封装起来有多处用到;
* @author samy
* @date 2014年10月19日 下午12:10:45
*/
public static String getNewOrderInfo(String out_trade_no, String subject, String total_fee) {
StringBuilder sb = new StringBuilder();
sb.append("partner=\"");// 合作者身份ID
sb.append(Keys.DEFAULT_PARTNER);
sb.append("\"&out_trade_no=\"");// 商户网站唯一订单号
sb.append(out_trade_no);
sb.append("\"&subject=\"");// 商品名称
sb.append(subject);
// sb.append("\"&body=\"");// 商品详情
// sb.append("充100返5元");
sb.append("\"&total_fee=\"");// 总金额
sb.append(total_fee);
sb.append("\"?ify_url=\"");// 网址需要做URL编码; 异步通知;服务器异步通知页面路径;
// sb.append(URLEncoder.encode("http://notify.java.jpxx.org/index.jsp"));
sb.append(URLEncoder.encode("http://waimai.365sji.com/notify_url_client.jsp"));
sb.append("\"&service=\"mobile.securitypay.pay");// 接口名称 ,固定值mobile.securitypay.pay
sb.append("\"&_input_charset=\"UTF-8");// 参数编码字符集
// sb.append("\"&return_url=\"");
// sb.append(URLEncoder.encode("http://m.alipay.com"));
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");// 支付超时 时间;
sb.append("\"");
String sign = Rsa.sign(sb.toString(), Keys.PRIVATE);
sign = URLEncoder.encode(sign);
StringBuffer buffer = new StringBuffer(sb);
buffer.append("&sign=\"");
buffer.append(sign);
buffer.append("\"&sign_type=\"RSA\"");// 签名;签名方式,签名类型,目前仅支持RSA
return new String(buffer);
}
ps:
参照部分:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
try {
String info = getNewOrderInfo(position);
String sign = Rsa.sign(info, Keys.PRIVATE);
sign = URLEncoder.encode(sign);
info += "&sign=\"" + sign + "\"&" + getSignType();// 签名;签名方式,签名类型,目前仅支持RSA
Log.i("ExternalPartner", "start pay");
Log.i("samy", "info = " + info);
final String orderInfo = info;
new Thread() {
public void run() {
AliPay alipay = new AliPay(ExternalPartnerAct.this, mHandler);
// 设置为沙箱模式,不设置默认为线上环境;从这里开始跳转到支付宝界面;运行完支付pay()后回调;
// alipay.setSandBox(true);
String result = alipay.pay(orderInfo);
Log.i(TAG, "result = " + result);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);
}
}.start();
}
catch (Exception ex) {
ex.printStackTrace();
Toast.makeText(ExternalPartnerAct.this, R.string.remote_call_failed, Toast.LENGTH_SHORT).show();
}
} /**
* @description:加载支付宝网页
* @author samy
* @date 2014年10月16日 下午7:16:41
*/
private void payByZFBWeb() {
// KJHttp kjHttp = GlobalApp.getKJHttp();
KJStringParams params = new KJStringParams();
params.put("trade_no", orderId);
params.put("subject", shopItemBean.merchantName);
params.put("total_fee", tempNeedPrice >= 0 ? tempNeedPrice + "" : (-tempNeedPrice) + "");
// kjHttp.urlGet(UrlConstants.PAY_SUBMIT, params, null);//现不做回调处理;
if (params != null) {
// StringBuilder是用来组拼请求地址和参数
StringBuilder str = new StringBuilder(UrlConstants.PAY_SUBMIT);
// str.append("?").append(params.toString());
str.append("?");
if (params != null && params.urlParams.size() != 0) {
for (ConcurrentHashMap.Entry<String, String> entry : params.urlParams.entrySet()) {
// 如果请求参数中有中文,需要进行URLEncoder编码 gbk/utf8
try {
str.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
str.append("&");
}
str.deleteCharAt(str.length() - 1);
}
confirm_order_btn.setEnabled(false);
Bundle bundle = new Bundle();
bundle.putString(BaseWebViewAct.PAGE_TITLE, "支付宝支付");
bundle.putString(BaseWebViewAct.PAGE_URL, str.toString());
showActivity(aty, PayByZFBAct.class, bundle);
}
} 开发中可能常出现的问题:
(1):调起快捷支付宝不出来;更换最新的assets下快捷支付的apk问当前最新的;
源码下载:http://download.csdn.net/detail/hongliuxing/8090903
http://download.csdn.net/detail/hongliuxing/8090891
官方支付:http://download.csdn.net/detail/hongliuxing/8090923
来自为知笔记(Wiz)
支付宝支付总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。