开发android应用需要第三方支付接口开发,有推荐的吗

2015年9月 移动开发大版内专家分月排行榜第二2015年6月 移动开发大版内专家分月排行榜第二2014年12月 移动开发大版内专家分月排行榜第二2014年7月 移动开发大版内专家分月排行榜第二2013年12月 移动开发大版内专家分月排行榜第二2013年11月 移动开发大版内专家分月排行榜第二2013年10月 移动开发大版内专家分月排行榜第二
2014年11月 移动开发大版内专家分月排行榜第三2014年2月 移动开发大版内专家分月排行榜第三
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。Android app 第三方支付宝支付接入
支付宝的接入相对比较简单,看看支付宝官网的文档基本都能搞定,但是切记一点让你们的后台也要搞清楚支付宝的流程,不然对接起来是一件很蛋疼的事情。
开发前一定要支付宝官方文档
强烈建议签名等处理在后台处理,我这个是测试是在自己本地写的,不要吐槽
想获取支付宝合作商户ID,及支付宝公钥请点击支付宝链接,生成密钥及PKCS8转码工具在文档中
添加android.permission.INTERNET权限和android.permission.ACCESS_NETWORK_STATE权限
要导入支付宝的包
特别注意事项(坑点)
下载支付宝的官网之后生成你所需要的密钥及PKCS8转码一定要小心
MainActivity中调起支付
Pay pay = new Pay(AffirmOrderActivity.this, paymoney);
public class Pay {
/**以下四项这些数值机密填入自己申请的就好**/
// 商户PID
public static final String PARTNER = &&;
// 商户收款账号
public static final String SELLER = &&;
// 商户私钥,pkcs8格式
public static final String RSA_PRIVATE = &&;
// 支付宝公钥
public static final String RSA_PUBLIC = &&;
private String mgoods,mprice,
private String mOutTradeNo;
Pay(Activity activity, String goods,String goodsmore,String price,String icon,int type, String outTradeNo) {
pay(price);
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc./doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为&9000&则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, &9000&)) {
Toast.makeText(context, &支付成功&, Toast.LENGTH_SHORT).show();
// 判断resultStatus 为非&9000&则代表可能支付失败
// &8000&代表支付结果因为支付渠道原因或者原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, &8000&)) {
Toast.makeText(context, &支付结果确认中&, Toast.LENGTH_SHORT).show();
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(context, &支付失败&, Toast.LENGTH_SHORT).show();
* call alipay sdk pay. 调用SDK支付
public void pay(String goods,String goodsmore,String price) {
if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
new AlertDialog.Builder(context).setTitle(&警告&).setMessage(&需要配置PARTNER | RSA_PRIVATE| SELLER&)
.setPositiveButton(&确定&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
}).show();
String orderInfo = getOrderInfo(goods, goodsmore, price);
String sign = sign(orderInfo);
* 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
* 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + &&sign=\&& + sign + &\&&& + getSignType();
Log.i(&lff&, &orderInfo == & +orderInfo);
Log.i(&lff&, &sign == & +sign);
Runnable payRunnable = new Runnable() {
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(context);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
mHandler.sendMessage(msg);
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
* get the sdk version. 获取SDK版本号
public void getSDKVersion() {
PayTask payTask = new PayTask(context);
String version = payTask.getVersion();
Toast.makeText(context, version, Toast.LENGTH_SHORT).show();
* create the order info. 创建订单信息
private String getOrderInfo(String subject, String body, String price) {
// 签约合作者身份ID
String orderInfo = &partner=& + &\&& + PARTNER + &\&&;
// 签约卖家支付宝账号
orderInfo += &&seller_id=& + &\&& + SELLER + &\&&;
// 商户网站唯一订单号
orderInfo += &&out_trade_no=& + &\&& + getOutTradeNo() + &\&&;
// 商品名称
orderInfo += &&subject=& + &\&& + subject + &\&&;
// 商品详情
orderInfo += &&body=& + &\&& + body + &\&&;
// 商品金额
orderInfo += &&total_fee=& + &\&& + &0.01& + &\&&;
// 服务器异步通知页面路径
orderInfo += &&ify_url=& + &\&& + &http://notify.msp.hk/notify.htm& + &\&&;
orderInfo += &&ify_url=& + &\&& + &http://112.74.129.252/new/zfbCallback& + &\&&;
// 服务接口名称, 固定值
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=\&\&&;
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += &&paymethod=\&expressGateway\&&;
return orderI
* get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
private String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat(&MMddHHmmss&, Locale.getDefault());
Date date = new Date();
String key = format.format(date);
Random r = new Random();
key = key + r.nextInt();
key = key.substring(0, 15);
return mOutTradeNo;
* sign the order info. 对订单信息进行签名
* @param content
待签名订单信息
private String sign(String content) {
return SignUtils.sign(content, RSA_PRIVATE);
* get the sign type we use. 获取签名方式
private String getSignType() {
return &sign_type=\&RSA\&&;
其它的工具类,原封不动拷贝过去就好
package com.easyhomework.teacher.
public final class Base64 {
private static final int BASELENGTH = 128;
private static final int LOOKUPLENGTH = 64;
private static final int TWENTYFOURBITGROUP = 24;
private static final int EIGHTBIT = 8;
private static final int SIXTEENBIT = 16;
private static final int FOURBYTE = 4;
private static final int SIGN = -128;
private static char PAD = '=';
private static byte[] base64Alphabet = new byte[BASELENGTH];
private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
for (int i = 0; i & BASELENGTH; ++i) {
base64Alphabet[i] = -1;
for (int i = 'Z'; i &= 'A'; i--) {
base64Alphabet[i] = (byte) (i - 'A');
for (int i = 'z'; i &= 'a'; i--) {
base64Alphabet[i] = (byte) (i - 'a' + 26);
for (int i = '9'; i &= '0'; i--) {
base64Alphabet[i] = (byte) (i - '0' + 52);
base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63;
for (int i = 0; i &= 25; i++) {
lookUpBase64Alphabet[i] = (char) ('A' + i);
for (int i = 26, j = 0; i &= 51; i++, j++) {
lookUpBase64Alphabet[i] = (char) ('a' + j);
for (int i = 52, j = 0; i &= 61; i++, j++) {
lookUpBase64Alphabet[i] = (char) ('0' + j);
lookUpBase64Alphabet[62] = (char) '+';
lookUpBase64Alphabet[63] = (char) '/';
private static boolean isWhiteSpace(char octect) {
return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
private static boolean isPad(char octect) {
return (octect == PAD);
private static boolean isData(char octect) {
return (octect & BASELENGTH && base64Alphabet[octect] != -1);
* Encodes hex octects into Base64
* @param binaryData
Array containing binaryData
* @return Encoded Base64 array
public static String encode(byte[] binaryData) {
if (binaryData == null) {
int lengthDataBits = binaryData.length * EIGHTBIT;
if (lengthDataBits == 0) {
return &&;
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1
char encodedData[] =
encodedData = new char[numberQuartet * 4];
byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
int encodedIndex = 0;
int dataIndex = 0;
for (int i = 0; i & numberT i++) {
b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 && 4)
: (byte) ((b2) && 4 ^ 0xf0);
byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 && 6)
: (byte) ((b3) && 6 ^ 0xfc);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k && 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[(l && 2) | val3];
encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
// form integral number of 6-bit groups
if (fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[k && 4];
encodedData[encodedIndex++] = PAD;
encodedData[encodedIndex++] = PAD;
} else if (fewerThan24bits == SIXTEENBIT) {
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 && 4)
: (byte) ((b2) && 4 ^ 0xf0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k && 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[l && 2];
encodedData[encodedIndex++] = PAD;
return new String(encodedData);
* Decodes Base64 data into octects
* @param encoded
string containing Base64 data
* @return Array containind decoded data.
public static byte[] decode(String encoded) {
if (encoded == null) {
char[] base64Data = encoded.toCharArray();
// remove white spaces
int len = removeWhiteSpace(base64Data);
if (len % FOURBYTE != 0) {
// should be pisible by four
int numberQuadruple = (len / FOURBYTE);
if (numberQuadruple == 0) {
return new byte[0];
byte decodedData[] =
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
int i = 0;
int encodedIndex = 0;
int dataIndex = 0;
decodedData = new byte[(numberQuadruple) * 3];
for (; i & numberQuadruple - 1; i++) {
if (!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))
|| !isData((d3 = base64Data[dataIndex++]))
|| !isData((d4 = base64Data[dataIndex++]))) {
}// if found &no data& just return null
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 && 6 | b4);
if (!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))) {
// if found &no data& just return null
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++];
if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
if (isPad(d3) && isPad(d4)) {
if ((b2 & 0xf) != 0)// last 4 bits should be zero
byte[] tmp = new byte[i * 3 + 1];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex] = (byte) (b1 && 2 | b2 && 4);
} else if (!isPad(d3) && isPad(d4)) {
b3 = base64Alphabet[d3];
if ((b3 & 0x3) != 0)// last 2 bits should be zero
byte[] tmp = new byte[i * 3 + 2];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
tmp[encodedIndex] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
} else { // No PAD e.g 3cQl
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 && 6 | b4);
return decodedD
* remove WhiteSpace from MIME containing encoded Base64 data.
* @param data
the byte array of base64 data (with WS)
* @return the new length
private static int removeWhiteSpace(char[] data) {
if (data == null) {
// count characters that's not whitespace
int newSize = 0;
int len = data.
for (int i = 0; i & i++) {
if (!isWhiteSpace(data[i])) {
data[newSize++] = data[i];
return newS
支付宝支付一共五部
生成秘钥私钥等(一般是后台处理的)
支付宝包复制带项目中
调用支付(上述MainActivity和pay类)
添加工具类对于Android应用程序开发,是否有必要引入第三方框架,比如一些第三方的MVC框架等等,大家怎么看? - 知乎54被浏览20987分享邀请回答82 条评论分享收藏感谢收起/p/android-query/ 。-----------------------------------------------------------------------------------------------------------------------------------------------比起单纯手机端的框架,我更期待的是某种整合了服务器端与手机端的解决方案。比如可以在服务器端实现 Model 和部分的 Controller,而在手机端则可以只是实现 View 。最终能够达到如下效果:避免显式的在手机端与服务器间进行通信,而是将远程的计算资源直接暴露给本地应用。隐藏数据的同步,Cache 管理等细节。统一的 push 机制。最后出来的效果非常类似于 Web Service,又和云计算以及移动应用扯上了关系。(我真不是来炒概念的)其实以上这些在 Android 系统中都有所体现了,只是至今没有被统一起来,或者必须依赖于 Google 的服务而难以在实际应用中部署。因此期待第三方的社区或者公司能提供一整套的解决方案。22 条评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 第三方支付平台开发 的文章

 

随机推荐