摘要:公鑰和私鑰的生成通過(guò)支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應(yīng)用即可。支付寶支付通知接口支付寶支付結(jié)果通知獲取支付寶過(guò)來(lái)反饋信息亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。
1、app公鑰和私鑰的生成
通過(guò)支付寶提供的工具即可下載并生成公鑰和私鑰,私鑰自己保留,公鑰要上傳到支付寶賬戶所在的應(yīng)用即可。
2、接下來(lái)就是通過(guò)app支付api調(diào)后臺(tái)接口,后臺(tái)通過(guò)公鑰和私鑰等 一系列的參數(shù)生成一段鍵值對(duì)給前端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; /** * 驗(yàn)簽 * @param alipayTradeModel * @return * @throws AlipayApiException */ @Override public String getSign(AlipayTradeModel alipayTradeModel) throws AlipayApiException { //實(shí)例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient( serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType); //實(shí)例化具體API對(duì)應(yīng)的request類,類名稱和接口名稱對(duì)應(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同時(shí)存在的情況下取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 可以直接給客戶端請(qǐng)求,無(wú)需再做處理。 return response.getBody(); } }
3、前端APP支付成功之后會(huì)調(diào)上面設(shè)置的notifyUrl(注意如果設(shè)置了權(quán)限要取消該url的jwt用戶認(rèn)證,我這里的url是:/alipay/notify)。調(diào)用的時(shí)候這里有一個(gè)坑,也是我遇到的坑,在這里跟大家分享一下:
1)我的這個(gè)controller存在亂碼問(wèn)題,所以要設(shè)置
@RequestMapping(value = "/alipay", produces = "application/json; charset=utf-8")
否則 會(huì)報(bào)亂碼錯(cuò)誤,空指針什么的
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()
再一個(gè)就是,如果你頁(yè)面本身就出現(xiàn)亂碼問(wèn)題,再通過(guò)下面這段代碼設(shè)置也是沒(méi)有用的,切記!
//亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。 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過(guò)來(lái)反饋信息 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)亂碼時(shí)使用。 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); log.info(name + "=" + valueStr); } //切記alipaypublickey是支付寶的公鑰,請(qǐng)去open.alipay.com對(duì)應(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"); //商戶訂單號(hào) String out_trade_no = params.get("out_trade_no"); //支付寶交易號(hào) 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、一步一步帶你完成支付寶支付功能的集成(超詳細(xì))
2、spring Boot 中文返回給瀏覽器亂碼 解析成問(wèn)號(hào)?? fastJson jackJson
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68128.html
摘要:最近在使用寫,中要求可以實(shí)現(xiàn)線上支付,研究了微信支付與支付寶支付。其實(shí)支付寶的支付原理很簡(jiǎn)單,無(wú)論是支付還是原生支付前臺(tái)只需要使用服務(wù)器返回的數(shù)據(jù)調(diào)起支付就可以了。 最近在使用vue寫webapp,app中要求可以實(shí)現(xiàn)線上支付,研究了微信H5支付與支付寶H5支付。其中微信H5支付處在內(nèi)測(cè)階段,需要申請(qǐng),按照格式寫了郵件七個(gè)工作日也沒(méi)得到回復(fù)郵件,據(jù)說(shuō)微信H5支付對(duì)于單量和交易額有要求,...
摘要:由于初版需求及開(kāi)發(fā)工作都沒(méi)有參與,在接手項(xiàng)目后過(guò)了遍前端結(jié)構(gòu)發(fā)現(xiàn)所有交互及組件都是現(xiàn)擼,并未使用市面上已有的優(yōu)秀前端框架從我個(gè)人角度理解上出發(fā),后續(xù)需求變更中當(dāng)需要實(shí)現(xiàn)某些常用組件樣式或交互時(shí),基本上都需要現(xiàn)擼或者尋找合適的組件。 2016悄無(wú)聲息的過(guò)去了,再過(guò)不久便是農(nóng)歷新年 這幾天相對(duì)清閑梳理了一下去年所做的工作,希望在新的一年能發(fā)展的更好 今年一共研發(fā)或升級(jí)了五款產(chǎn)品:合伙人、奪...
摘要:支付寶支持網(wǎng)站支付,支付,支付和當(dāng)面付,但是要想接入網(wǎng)站,需要網(wǎng)站備案,并且還要有營(yíng)業(yè)執(zhí)照??墒?,這個(gè)途徑后來(lái)經(jīng)過(guò)證實(shí),支付寶已經(jīng)停用。缺點(diǎn)也是相當(dāng)?shù)拿黠@只有支付寶可以用這種方式,因?yàn)槲⑿攀窃趦?nèi)部有一個(gè)公眾號(hào)形式的提示。 0.背景 前段時(shí)間準(zhǔn)備把自己的博客做成付費(fèi)閱讀或者訂閱的形式,雖然沒(méi)想著要贏利多少錢,但是起碼養(yǎng)的起自己站點(diǎn)域名服務(wù)器費(fèi)用即可。但是大家都懂,草根站長(zhǎng),又沒(méi)公司,想...
閱讀 1901·2021-11-22 09:34
閱讀 3039·2021-09-28 09:35
閱讀 13474·2021-09-09 11:34
閱讀 3603·2019-08-29 16:25
閱讀 2834·2019-08-29 15:23
閱讀 2047·2019-08-28 17:55
閱讀 2437·2019-08-26 17:04
閱讀 3053·2019-08-26 12:21