看到网上写支付的文章不多,又有感于许多资料和官网内容中到处都有坑,填过坑的我决定让支付简单点(想起了我当初到处找资料的情景,唉,心累)。为便于浏览,分为支付宝支付和微信支付上下两篇。看官请看......
第一步:导入以及配置开发资源(别忘了修改Manifest)
在进行第二步前,我们要有个概念,我们需要构建的支付是怎样的流程。我们支付就是把钱转到一个账号里,所以后台会通过官网文档集成一个商户平台,然后提供平台的商家id,要支付的卖家支付宝账号,私钥,订单号,这些服务器都会提供给我们,我们只需添加订单信息包括什么货物,哪种方式(如哪张银行卡),价格。
先构建一个订单信息如下,说明Contants下的常量后台会提供的。
//订单信息
public String getOrderInfo(String subject, String body, String price,String order_id) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + Constants.PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + Constants.SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + order_id + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + Constants.zfbnotify
+ "\"";
// 服务接口名称, 固定值
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\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
return orderInfo;
}
第二步:支付接口调用,到这步可能看得比较糊涂,其实就按它写的”在新线程中调用支付接口,然后获取PayTask支付对象调用支付,“”
我这里只传如图的信息
private void aliPay(String price,String order_name,String order_id) {
//注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
String orderInfo = getOrderInfo(order_name, "合理消费", price,order_id);
String sign = sign(orderInfo);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(PayOrderActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
private String getSignType() {
return "sign_type=\"RSA\"";
}
private String sign(String content) {
return SignUtils.sign(content, Constants.RSA_PRIVATE);
}
第三步:支付结果获取
这里可以用同步返回,这里我用的是异步通知,notify_url后台会提供。
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(PayOrderActivity.this, "支付成功",
Toast.LENGTH_SHORT).show();
// TODO: 2017/2/17 根据需要做支付成功后该做的事
} else {
// 判断resultStatus 为非“9000”则代表可能支付失败
// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(PayOrderActivity.this, "支付结果确认中",
Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(PayOrderActivity.this, "支付失败",
Toast.LENGTH_SHORT).show();
// TODO: 2017/2/17 根据需要做支付失败后该做的事
}
}
break;
}
case SDK_CHECK_FLAG: {
Toast.makeText(PayOrderActivity.this, "检查结果为:" + msg.obj,
Toast.LENGTH_SHORT).show();
break;
}
case CUT_TIME:
break;
case CUT_TIME_COMPLETE:
break;
default:
break;
}
};
};
第四步,在需要支付的地方aliPay("0.01","后悔药",order_id);//order_id为服务器返回的订单id。
第五步,恭喜你成功剁手!
OK。
本文详细介绍了一个简化后的支付宝支付流程,包括构建订单信息、支付接口调用、支付结果获取等步骤,并提供了具体的代码实现。
1275

被折叠的 条评论
为什么被折叠?



