1. 程式人生 > >支付寶掃碼支付、APP支付

支付寶掃碼支付、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即可