java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
最近一直在接觸第三方,剛接入完支付寶的API做一下總結,個人能力薄弱有不對的地方望指教.? 做的是一個小型電商項目,所以會接入第三方的支付和登入功能, 第一次接入第三方擼了很多官方文檔.
然后創建應用選擇需要接入的功能,有些應用是需要簽約的簽約就好了審核蠻快的.
以上應用申請,功能申請的一些操作我就不多做解釋了網上很多例子,
Java支付寶支付
這里有APP支付和手機網站支付, APP支付是針對Android和IOS的案例,? 那么我做的是手機網站支付針對Java后臺的案例.
我直接貼我的代碼:
/**
*
* 說明:支付寶支付 (我只填了部分參數,如果有更多參數需求的 可以直接:https://docs.open.alipay.com/203/107090/ )
* @param orderNumber 商戶網站唯一訂單號
* @param orderMoney 訂單金額
* @param orderSubject 商品的標題,關鍵字
* @param notifyUrl 異步回調地址(后臺) 獲取訂單信息
* @param returnUrl 同步回調地址(APP) 處理業務及渲染頁面
* @author ArLen
* @time:2018年12月11日 下午2:14:57
*/
@Override
public void payment(String orderNumber,
String orderMoney,
String orderSubject,
String notifyUrl,
String returnUrl) {
//填寫自己創建的app的對應參數
private static AlipayClient alipayClient = new DefaultAlipayClient("支付寶網關", "appid", "私鑰", "json", "utf-8", "公鑰","RSA2");
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
// 封裝請求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(orderNumber);
model.setTotalAmount(orderMoney);
model.setSubject(orderSubject);
model.setProductCode("QUICK_WAP_WAY");
alipayRequest.setBizModel(model);
//異步回調地址(后臺)
alipayRequest.setNotifyUrl(notifyUrl);
// 同步回調地址(APP)
alipayRequest.setReturnUrl(returnUrl);
try {
//調用SDK生成表單
String form = alipayClient.pageExecute(alipayRequest).getBody();
//打印, 可以直接response到頁面上
System.out.println(form);
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
支付成功后支付寶會自動請求你寫的? notifyUrl (異步通知, 接收支付寶異步通知,從而獲取此訂單的狀態) 和?returnUrl? (支付完成后,支付寶會發送同步請求進行數據渲染,? 這里我是用ModelAndView 渲染的數據)
notifyUrl異步通知代碼
/**
*
* 說明:對于手機網站支付產生的交易,支付寶會根據原始支付API中傳入的異步通知地址notify_url,通過POST請求的形式將支付結果作為參數通知到商戶系統。
* @param request
* @return
* @author Arlen
* @time:2018年12月3日 下午4:51:35
*/
@RequestMapping("notifyUrl")
@ResponseBody
public String notify(HttpServletRequest request){
int im=0;
im++;
//測試請求次數
System.out.println("次數:"+im);
//獲取支付寶POST過來反饋信息
Map params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
//商戶訂單號
String out_trade_no = request.getParameter("out_trade_no");
//支付寶交易號
String trade_no = request.getParameter("trade_no");
//交易狀態
String trade_status = request.getParameter("trade_status");
System.out.println(trade_status);
try {
boolean verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");
if(verify_result){
//驗證成功
//請在這里加上商戶的業務邏輯程序代碼
System.out.println("returnUrl_params:驗證成功");
//——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
boolean flg = false;
if(trade_status.equals("TRADE_FINISHED")){
System.out.println("returnUrl_params:交易結束");
//交易結束,不可退款
//注意:
//退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知
} else if (trade_status.equals("TRADE_SUCCESS")){
//交易支付成功
//注意:
//付款完成后,支付寶系統發送該交易狀態通知
//根據訂單號將訂單狀態和支付寶記錄表中狀態都改為已支付
System.out.println("returnUrl_params:交易支付成功");
flg = true;
}
//——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
if(flg){
return "success";
}else{
return "fail";
}
}else{//驗證失敗
//out.print("fail");
return "fail";
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "500";
}
}
returnUrl 同步通知代碼
我在這邊處理了業務邏輯,還在測試階段, 我覺得有些欠缺.
@RequestMapping("/returnUrl")
public ModelAndView result( HttpServletRequest request) {
System.out.println("進來");
//用ModelAndView 進行數據渲染
ModelAndView mv = new ModelAndView("alipay/return_url");
//獲取支付寶GET過來反饋信息
Map params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//交易訂單編號
String out_trade_no = request.getParameter("out_trade_no");
//交易金額
String total_amount = request.getParameter("total_amount");
//支付寶交易賬號
//String trade_no = request.getParameter("trade_no");
//訂單創建時間
String timestamp = request.getParameter("timestamp");
mv.addObject("out_trade_no", out_trade_no);
mv.addObject("total_amount", total_amount);
mv.addObject("timestamp", timestamp);
//打印所有響應數據
System.out.println("returnUrl_params:"+params);
try {
boolean verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");
if(verify_result){
//驗證成功 這里寫的是假代碼
//系統處理根據支付寶回調更改訂單狀態或者其他關聯表的數據 (走業務流程, 根據訂單編號獲取訂單數據
//Order order =orderService.queryOrderByNumber(out_trade_no);
/* if(order !=null){
//order不為null
mv.addObject("verify_result", verify_result);
mv.addObject("msg", "商戶訂單號不存在");
} */
return mv;
}else{
//驗證失敗 跳失敗頁面
System.out.println("驗證失敗");
return null;
}
} catch (AlipayApiException e) {
e.printStackTrace();
//出現異常 跳失敗頁面
return null;
}
}
今天就先寫到 支付寶支付,明天再寫支付寶退款及其他操作.
總結
以上是生活随笔為你收集整理的java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LG退出手机市场!绝版手机LG Wing
- 下一篇: 黑龙江漠河零下42.5℃迎入冬最低温:寒