支付寶掃碼支付、APP支付
這些已經介紹過,下面掃碼支付也是用IJPay,匯入alipay-sdk-java2017xxxxxxxx.jar,如何匯入上篇已經介紹過
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay</artifactId>
<version>0.8</version>
</dependency>
這個很不錯,很多問題都得到了解決
開通掃碼支付,看好官方文件
1商戶系統呼叫支付寶預下單介面alipay.trade.precreate,獲得該訂單二維碼圖片地址。
2發起輪詢獲得支付結果:等待5秒後呼叫交易查詢介面alipay.trade.query通過支付時傳入的商戶訂單號(out_trade_no)查詢支付結果(返回引數TRADE_STATUS),如果仍然返回等待使用者付款(WAIT_BUYER_PAY),則再次等待5秒後繼續查詢,直到返回確切的支付結果(成功TRADE_SUCCESS 或 已撤銷關閉TRADE_CLOSED),或是超出輪詢時間。在最後一次查詢仍然返回等待使用者付款的情況下,必須立即呼叫交易撤銷介面alipay.trade.cancel將這筆交易撤銷,避免使用者繼續支付。
3除了主動輪詢,也可以通過接受非同步通知獲得支付結果,詳見掃碼非同步通知,注意一定要對非同步通知做驗籤,確保通知是支付寶發出的。
呼叫介面:alipay.trade.precreate
直接上程式碼
/** * 掃碼支付 返回一個連結自己生成二維碼 已測試 * */ @RequestMapping(value ="/tradePrecreatePay.do") public String tradePrecreatePay(Model modelV) { String subject = "支付寶掃碼支付測試"; String totalAmount = "0.1"; String storeId = "123"; String notifyUrl = "http://192.168.0.148:8080/alipay/notify_url.do"; AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); model.setSubject(subject); model.setTotalAmount(totalAmount); model.setStoreId(storeId); model.setTimeoutExpress("1m"); model.setOutTradeNo(StringUtils.getOutTradeNo()); try { AliPayApiConfigKit.putApiConfig(getApiConfig()); String resultStr = AliPayApi.tradePrecreatePay(model, notifyUrl); JSONObject jsonObject = JSONObject.parseObject(resultStr); System.out.println("jsonobject--"+jsonObject); String qrcode=jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code"); System.out.println(qrcode); modelV.addAttribute("qrcode",qrcode); return "success"; } catch (Exception e) { e.printStackTrace(); } return null; }
請求tradePrecreatePayd.do 列印的jsonobject----------
{"alipay_trade_precreate_response{"msg":"Success","code":"10000","out_trade_no":"110114055715095","qr_code":"https://qr.alipay.com/bax08974wxnhvq6xi5sf604a"},"sign":"簽名"}
生成qrcode---------https://qr.alipay.com/bax08974wxnhvq6xi5sf604a 就是支付的二維碼圖片地址,將其生成二維碼即可支付
將其返回,我用的是jquery外掛生成的二維碼
<div id="output"></div>
<script src="/js/jquery-1.10.2.min.js"></script>
<script src="/js/jquery.qrcode.min.js"></script>
<script>
code();
function code() {
var code='${qrcode}';
/*jquery二維碼生成外掛生成二維碼*/
jQuery(function () {
jQuery("#output").qrcode(code);
})
}
</script>
這個方式就自己選擇吧,最後生成二維碼掃描支付即可,notify_url非同步返回程式碼上篇有這裡就不貼了
我測試有一個問題,支付沒有回撥notify_url,因為支付寶別的支付在區域網測試就可以,所以我就沒用域名,而掃碼支付得用域名訪問才會回撥成功!!!
demo是基於SpringMVC的,掃碼支付應該沒加,自己加上,配置好改成自己的資訊就可以測試,http://download.csdn.net/download/goligory/10048415
相關連結:http://blog.csdn.net/zyw_java/article/details/7143726
APP支付
官方文件:https://docs.open.alipay.com/204
客戶端我就不說了,我這隻說服務端提供的資訊,呼叫生成orderInfo
* app支付
* 生成的orderInfo
*/
@RequestMapping(value = "/appPay.do")
@ResponseBody
public String appPay() {
try {
System.out.println("-----------------------------app pay start------------------------------");
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是測試資料-By Javen");
model.setSubject("App支付測試-By Javen");
model.setOutTradeNo(StringUtils.getOutTradeNo());
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setPassbackParams("callback params");
model.setProductCode("QUICK_MSECURITY_PAY");
System.out.println("-2-");
AliPayApiConfigKit.putApiConfig(getApiConfig());
System.out.println("-3-");
String orderInfo = AliPayApi.startAppPayStr(model, "http://xxx/alipay/notify_url.do");
System.out.println("orderInfo----------"+orderInfo);
return orderInfo;
} catch (AlipayApiException e) {
e.printStackTrace();
result.addError("system error:"+e.getMessage());
}
return null;
}
生成形式如下;
將生成的orderInfo返回Android即可