摘要:公鑰和私鑰的生成通過支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應用即可。支付寶支付通知接口支付寶支付結果通知獲取支付寶過來反饋信息亂碼解決,這段代碼在出現亂碼時使用。
1、app公鑰和私鑰的生成
通過支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應用即可。
2、接下來就是通過app支付api調后臺接口,后臺通過公鑰和私鑰等 一系列的參數生成一段鍵值對給前端APP:
package com.qtay.gls.service.impl; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.qtay.gls.dao.entity.AlipayTradeModel; import com.qtay.gls.service.IPayService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class PayService implements IPayService { @Value("${alipay.app_id}") private String appId; @Value("${alipay.app_private_key}") private String appPrivateKey; @Value("${alipay.charset}") private String charset; @Value("${alipay.alipay_public_key}") private String alipayPublicKey; @Value("${alipay.sign_type}") private String signType; @Value("${alipay.notify_url}") private String notifyUrl; @Value("${alipay.server_url}") private String serverUrl; @Value("${alipay.format}") private String format; @Value("${alipay.product_code}") private String productCode; /** * 驗簽 * @param alipayTradeModel * @return * @throws AlipayApiException */ @Override public String getSign(AlipayTradeModel alipayTradeModel) throws AlipayApiException { //實例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient( serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(alipayTradeModel.getBody()); model.setSubject(alipayTradeModel.getSubject()); model.setOutTradeNo(alipayTradeModel.getOutTradeNo()); model.setTimeoutExpress(alipayTradeModel.getTimeoutExpress()); model.setTotalAmount(alipayTradeModel.getTotalAmount()); model.setProductCode(productCode); request.setBizModel(model); request.setNotifyUrl(notifyUrl); //這里和普通的接口調用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求,無需再做處理。 return response.getBody(); } }
3、前端APP支付成功之后會調上面設置的notifyUrl(注意如果設置了權限要取消該url的jwt用戶認證,我這里的url是:/alipay/notify)。調用的時候這里有一個坑,也是我遇到的坑,在這里跟大家分享一下:
1)我的這個controller存在亂碼問題,所以要設置
@RequestMapping(value = "/alipay", produces = "application/json; charset=utf-8")
否則 會報亂碼錯誤,空指針什么的
18-01-04 13:49:42.755 DEBUG [http-nio-9090-exec-1] o.s.web.servlet.DispatcherServlet - Could not complete request java.lang.NullPointerException: null
.antMatchers("/alipay/**").permitAll()
再一個就是,如果你頁面本身就出現亂碼問題,再通過下面這段代碼設置也是沒有用的,切記!
//亂碼解決,這段代碼在出現亂碼時使用。 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
package com.qtay.gls.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping(value = "/alipay", produces = "application/json; charset=utf-8") public class AlipayController { private Logger log = LoggerFactory.getLogger(AlipayController.class); @Value("${alipay.alipay_public_key}") private String alipayPublicKey; @Value("${alipay.charset}") private String charset; @Value("${alipay.sign_type}") private String signType; /** * 支付寶支付通知接口: * * @param * @return */ @PostMapping("/notify") public String notify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException { log.info("支付寶支付結果通知" + request.getParameterMap().toString()); //獲取支付寶POST過來反饋信息 Mapparams = new HashMap<>(); Map requestParams = request.getParameterMap(); for (Object o : requestParams.keySet()) { String name = (String) o; 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] + ","; } //亂碼解決,這段代碼在出現亂碼時使用。 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); log.info(name + "=" + valueStr); } //切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應應用下查看。 //boolean AlipaySignature.rsaCheckV1(Map params, String publicKey, String charset, String sign_type) boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType); //todo:flag為什么是false log.info("================== signVerified ==================" + signVerified); if (signVerified) { if ("TRADE_SUCCESS".equals(params.get("trade_status"))) { //付款金額 String amount = params.get("buyer_pay_amount"); //商戶訂單號 String out_trade_no = params.get("out_trade_no"); //支付寶交易號 String trade_no = params.get("trade_no"); log.info("amount=" + amount + ",out_trade_no=" + out_trade_no + ",trade_no=" + trade_no); return "success"; } } return "fail"; } }
參考文章:
1、一步一步帶你完成支付寶支付功能的集成(超詳細)
2、spring Boot 中文返回給瀏覽器亂碼 解析成問號?? fastJson jackJson
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68128.html
摘要:最近在使用寫,中要求可以實現線上支付,研究了微信支付與支付寶支付。其實支付寶的支付原理很簡單,無論是支付還是原生支付前臺只需要使用服務器返回的數據調起支付就可以了。 最近在使用vue寫webapp,app中要求可以實現線上支付,研究了微信H5支付與支付寶H5支付。其中微信H5支付處在內測階段,需要申請,按照格式寫了郵件七個工作日也沒得到回復郵件,據說微信H5支付對于單量和交易額有要求,...
摘要:由于初版需求及開發工作都沒有參與,在接手項目后過了遍前端結構發現所有交互及組件都是現擼,并未使用市面上已有的優秀前端框架從我個人角度理解上出發,后續需求變更中當需要實現某些常用組件樣式或交互時,基本上都需要現擼或者尋找合適的組件。 2016悄無聲息的過去了,再過不久便是農歷新年 這幾天相對清閑梳理了一下去年所做的工作,希望在新的一年能發展的更好 今年一共研發或升級了五款產品:合伙人、奪...
摘要:支付寶支持網站支付,支付,支付和當面付,但是要想接入網站,需要網站備案,并且還要有營業執照。可是,這個途徑后來經過證實,支付寶已經停用。缺點也是相當的明顯只有支付寶可以用這種方式,因為微信是在內部有一個公眾號形式的提示。 0.背景 前段時間準備把自己的博客做成付費閱讀或者訂閱的形式,雖然沒想著要贏利多少錢,但是起碼養的起自己站點域名服務器費用即可。但是大家都懂,草根站長,又沒公司,想...
閱讀 1883·2021-11-22 09:34
閱讀 3010·2021-09-28 09:35
閱讀 13374·2021-09-09 11:34
閱讀 3594·2019-08-29 16:25
閱讀 2820·2019-08-29 15:23
閱讀 2035·2019-08-28 17:55
閱讀 2424·2019-08-26 17:04
閱讀 3044·2019-08-26 12:21