摘要:公鑰和私鑰的生成通過支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應(yīng)用即可。支付寶支付通知接口支付寶支付結(jié)果通知獲取支付寶過來反饋信息亂碼解決,這段代碼在出現(xiàn)亂碼時使用。
1、app公鑰和私鑰的生成
通過支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應(yīng)用即可。
2、接下來就是通過app支付api調(diào)后臺接口,后臺通過公鑰和私鑰等 一系列的參數(shù)生成一段鍵值對給前端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對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?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); //這里和普通的接口調(diào)用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求,無需再做處理。 return response.getBody(); } }
3、前端APP支付成功之后會調(diào)上面設(shè)置的notifyUrl(注意如果設(shè)置了權(quán)限要取消該url的jwt用戶認證,我這里的url是:/alipay/notify)。調(diào)用的時候這里有一個坑,也是我遇到的坑,在這里跟大家分享一下:
1)我的這個controller存在亂碼問題,所以要設(shè)置
@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()
再一個就是,如果你頁面本身就出現(xiàn)亂碼問題,再通過下面這段代碼設(shè)置也是沒有用的,切記!
//亂碼解決,這段代碼在出現(xiàn)亂碼時使用。 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("支付寶支付結(jié)果通知" + 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] + ","; } //亂碼解決,這段代碼在出現(xiàn)亂碼時使用。 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); log.info(name + "=" + valueStr); } //切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應(yīng)應(yīng)用下查看。 //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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68128.html
摘要:最近在使用寫,中要求可以實現(xiàn)線上支付,研究了微信支付與支付寶支付。其實支付寶的支付原理很簡單,無論是支付還是原生支付前臺只需要使用服務(wù)器返回的數(shù)據(jù)調(diào)起支付就可以了。 最近在使用vue寫webapp,app中要求可以實現(xiàn)線上支付,研究了微信H5支付與支付寶H5支付。其中微信H5支付處在內(nèi)測階段,需要申請,按照格式寫了郵件七個工作日也沒得到回復(fù)郵件,據(jù)說微信H5支付對于單量和交易額有要求,...
摘要:由于初版需求及開發(fā)工作都沒有參與,在接手項目后過了遍前端結(jié)構(gòu)發(fā)現(xiàn)所有交互及組件都是現(xiàn)擼,并未使用市面上已有的優(yōu)秀前端框架從我個人角度理解上出發(fā),后續(xù)需求變更中當(dāng)需要實現(xiàn)某些常用組件樣式或交互時,基本上都需要現(xiàn)擼或者尋找合適的組件。 2016悄無聲息的過去了,再過不久便是農(nóng)歷新年 這幾天相對清閑梳理了一下去年所做的工作,希望在新的一年能發(fā)展的更好 今年一共研發(fā)或升級了五款產(chǎn)品:合伙人、奪...
摘要:支付寶支持網(wǎng)站支付,支付,支付和當(dāng)面付,但是要想接入網(wǎng)站,需要網(wǎng)站備案,并且還要有營業(yè)執(zhí)照??墒?,這個途徑后來經(jīng)過證實,支付寶已經(jīng)停用。缺點也是相當(dāng)?shù)拿黠@只有支付寶可以用這種方式,因為微信是在內(nèi)部有一個公眾號形式的提示。 0.背景 前段時間準備把自己的博客做成付費閱讀或者訂閱的形式,雖然沒想著要贏利多少錢,但是起碼養(yǎng)的起自己站點域名服務(wù)器費用即可。但是大家都懂,草根站長,又沒公司,想...
閱讀 2047·2021-11-22 09:34
閱讀 3379·2021-09-28 09:35
閱讀 13922·2021-09-09 11:34
閱讀 3696·2019-08-29 16:25
閱讀 2899·2019-08-29 15:23
閱讀 2103·2019-08-28 17:55
閱讀 2500·2019-08-26 17:04
閱讀 3101·2019-08-26 12:21