首頁>科技>

1、進入支付寶螞蟻金服開放平臺建立一個應用

螞蟻金服支付寶開發者中心 網址如下:https://developers.alipay.com/developmentAccess/developmentAccess.htm

可以看到有一個(網頁&移動應用的),進入開放平臺建立一個這樣的應用就可以了

如果你是首次會看到一個讓你填寫資訊加入平臺的頁面。

建立完應用後你將得到以下頁面:

也可以給你建立的應用增加能力,比如APP支付能力,獲取會員資訊等等。需要注意的是有些功能是需要簽約的。如下圖所示:

2、接入支付sdk,服務端jar包
<dependency>  <groupid>com.alipay.sdk</groupid>  <artifactid>alipay-sdk-java</artifactid>  <version>4.3.0.ALL</version></dependency>
3、下單處理程式碼
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setBody("購買["+placeOrderForm.getProductName()+"]");model.setSubject("購買xxx["+placeOrderForm.getProductName()+"]");model.setOutTradeNo(order.getUuid());model.setTotalAmount(String.valueOf(order.getTotalOrderPrice()));try {\tString orderString = alipaySao.createALipayTrade(model);\tMap<string,object> resultMap = ImmutableMap.of("orderString",orderString,"orderNo",order.getUuid());\t//更新訂單為支付中\tthis.updatePayStatus(order.getUuid(),PayStatusEnum.PAYING.getCode(),"");\treturn ResponseVo.buildSuccessResponse(resultMap);} catch (AlipayApiException e) {\tlog.error("AlipayApiException e={}",e);\treturn ResponseVo.buildResponse(ResponseEnum.ALIPAY_ERROR);}
4、與支付寶進行通訊
初始化:// 例項化客戶端alipayClient = new DefaultAlipayClient(        AlipayConfig.ALIPAY_URL,        AlipayConfig.APP_ID,        AlipayConfig.PRIVATE_KEY,        AlipayConfig.FORMAT,        AlipayConfig.CHARSET,        AlipayConfig.ALIPAY_PUBLIC_KEY,        AlipayConfig.SIGN_TYPE);/** * 支付客戶端 * @throws AlipayApiException * @return */@Overridepublic String createALipayTrade(AlipayTradeAppPayModel model) throws AlipayApiException {    // 例項化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:alipay.trade.app.pay    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();    // SDK已經封裝掉了公共引數,這裡只需要傳入業務引數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。    model.setTimeoutExpress("60m");    model.setProductCode("QUICK_MSECURITY_PAY");    request.setBizModel(model);    request.setNotifyUrl(AlipayConfig.CALLBACK_URL);    //非同步回撥url    // 這裡和普通的介面呼叫不同,使用的是sdkExecute    AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);    log.info("apliay.response.body={}",response.getBody());    //就是orderString 可以直接給客戶端請求,無需再做處理。    return response.getBody();}
5、支付寶相關配置(實際應用建議使用配置項管理)
package com.fast.tpp.dto;public class AlipayConfig {        /**         * 簽約的支付寶賬號對應的支付寶唯一使用者號,以2088開頭的16位純數字組成         */        public static final String PID = "xx";        /**         * 正式環境請求地址         */        public static String ALIPAY_URL = "https://openapi.alipay.com/gateway.do";        /**         * 支付寶分配給開發者的應用ID         *         */        public static String APP_ID = "xxx";        /**         * 僅支援JSON         */        public static String FORMAT = "JSON";        /**         * 請求使用的編碼格式         */        public static String CHARSET = "utf-8";        /**         * 商戶生成簽名字串所使用的簽名演算法型別         */        public static String SIGN_TYPE = "RSA2";        /**         * 支付寶公鑰         */        public static String ALIPAY_PUBLIC_KEY =xxx;        /**         * 商戶私鑰         */        public static String PRIVATE_KEY =XXX";        /**         * 回撥地址         */        public static String CALLBACK_URL = "xxx";}
6、支付狀態設定
package com.fast.common.enums;/** * 支付狀態 */public enum PayStatusEnum {\tNOT_PAY(0,"未支付"),\tPAYING(1, "支付中"),\tSUCCESS(2,"支付成功"),\tFAILUE(3, "支付失敗"),    ;\tprivate int code;\tprivate String value;\tPayStatusEnum(int code, String value){\t\tthis.code = code;\t\tthis.value = value;\t}\t\t// 獲取對應的文字\tpublic static String getName(int code) {\t\tfor (PayStatusEnum c : PayStatusEnum.values()) {\t\t  if (c.getCode() == code) {\t\t     return c.value;\t\t  }\t\t}\t\treturn null;\t}\t\tpublic int getCode() {\t\treturn code;\t}\tpublic void setCode(int code) {\t\tthis.code = code;\t}\tpublic String getValue() {\t\treturn value;\t}\tpublic void setValue(String value) {\t\tthis.value = value;\t}}
7、回撥通知介面
/**\t * 支付寶支付通知\t * @param request\t * @param response\t * @return\t * @throws IOException\t */\t@RequestMapping(value="/alipayNotice.do",method = RequestMethod.POST)\t@ResponseBody\t@NoneAuth\t@SysLog(actionName = "支付寶支付通知")\tpublic String alipayNotice(HttpServletRequest request, HttpServletResponse response) throws IOException {\t\tMap<string, string> params = new HashMap<string, string>();\t\tMap requestParams = request.getParameterMap();\t\tfor (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {\t\t\tString name = (String) iter.next();\t\t\tString[] values = (String[]) requestParams.get(name);\t\t\tString valueStr = "";\t\t\tfor (int i = 0; i < values.length; i++) {\t\t\t\tvalueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";\t\t\t}\t\t\tparams.put(name, valueStr);\t\t}\t\t// 切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應應用下檢視。\t\ttry {\t\t\tboolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,\t\t\t\t\tAlipayConfig.SIGN_TYPE);\t\t\tif (flag) {\t\t\t\tString tradeStatus = params.get("trade_status");\t\t\t\tString outTradeNo = params.get("out_trade_no");\t\t\t\tString tradeNo = params.get("trade_no");\t\t\t\t//購買者使用者ID\t\t\t\tString openId = params.get("buyer_logon_id");\t\t\t\tthis.orderService.alipayNotice(tradeStatus,outTradeNo,tradeNo,openId);\t\t\t\tif ("TRADE_SUCCESS".equals(tradeStatus)){\t\t\t\t\treturn "success";\t\t\t\t}\t\t\t}\t\t} catch (Exception e) {\t\t\te.printStackTrace();\t\t}\t\treturn "fail";\t}\t\t\t對應的service方法為:\t/**\t * 支付寶支付通知\t * @param tradeStatus\t * @param outTradeNo\t * @param tradeNo\t * @param openId\t */\tpublic void alipayNotice(String tradeStatus, String outTradeNo, String tradeNo, String openId){\t\tlog.info("alipayNotice outTradeNo={} tradeStatus={}",outTradeNo,tradeNo);\t\tString orderNo = outTradeNo;\t\tif ("TRADE_SUCCESS".equals(tradeStatus)) {\t\t\t// 交易支付成功的執行相關業務邏輯\t\t\tOrder order = this.getOrderByOrderNo(orderNo);\t\t\tif(null==order){\t\t\t\treturn;\t\t\t}\t\t\t//只有在未支付成功的狀態下才可以發簡訊和更新生效時間\t\t\tif (order.getPayStatus()!=PayStatusEnum.SUCCESS.getCode()){\t\t\t\tthis.orderMapper.updatePrepayId(tradeNo,orderNo);\t\t\t\t//處理支付成功邏輯\t\t\t\thandlePaySuccess(order,openId);\t\t\t}\t\t} else if ("TRADE_CLOSED".equals(tradeStatus)) {\t\t\t// 未付款交易超時關閉,或支付完成後全額退款,執行相關業務邏輯            //失敗 更改訂單狀態為支付失敗\t\t\tthis.updatePayStatus(outTradeNo,PayStatusEnum.FAILUE.getCode(),openId);\t\t}\t}

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 手機淘寶移動端接入閘道器基礎架構演進之路