先上代码
服务端:
AlipayClient alipayClient = new DefaultAlipayClient(PayConfig.gateway,
PayConfig.appid, PayConfig.private_key, "json",
PayConfig.charset, PayConfig.public_key, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试");
model.setOutTradeNo("70501111111S001112109");
model.setTimeoutExpress("10d");
model.setTotalAmount("1000.00");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("http://umngz7.natappfree.cc/aimilun/order/alipayResult");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
String body = response.getBody();
System.out.println("返回的body = " + body);//就是orderString 可以直接给客户端请求,无需再做处理。
return body;
} catch (AlipayApiException e) {
e.printStackTrace();
}
这几个参数,与开放文档参数名一一对照。
注意:我想你应该在文档上看到了签名这个参数,但是实际我们不用操心参数这个怎么得到,开放平台SDK封装了签名实现,只需在创建DefaultAlipayClient对象时,设置请求网关(gateway),应用id(app_id),应用私钥(private_key),编码格式(charset),支付宝公钥(alipay_public_key),签名类型(sign_type)即可,报文请求时会自动进行签名。
ok,客户端代码如下:
//请求服务器给我参数,因为我们需要拿到服务器返回的参数字符串才能唤起支付宝,服务器返回的参数无需处理,直接可以拿来唤起支付宝。
new Thread(new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(OrderActivity.this);
URL url = null;
try {
url = new URL("http://umngz7.natappfree.cc/aimilun/app/alipay");
} catch (MalformedURLException e) {
e.printStackTrace();
}
HttpURLConnection httpUrlConnection;
try {
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.setReadTimeout(8000);
httpUrlConnection.setConnectTimeout(8000);
InputStream inputStream = httpUrlConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String result_ = reader.readLine();
Logs.d("返回结果:" + result_);
Map<String, String> result = alipay.payV2(result_, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//响应上面的handler
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
//调用成功,则处理业务逻辑
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(OrderActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(OrderActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(OrderActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
}
}
}
}
还有一点,我们需要配置商户密钥和公钥,那么请参考 http://www.jianshu.com/p/5698a04dd919
ok,到此结束,笔者能力有限,不足之处欢迎指出。
网友评论