阿里支付寶支付開發詳細
阿新 • • 發佈:2018-11-05
無論在web開發、移動開發中,使用支付寶支付是必不可少的技能,本文將收集本人在開發中遇到的問題,也可以加入交流群244284555 和博主進行溝通
建立支付寶應用前提必須使用企業認證的支付寶賬號,否則將無法建立應用
登入後進入開發者中心選擇網頁移動應用
選擇支付接入
建立好應用後,需開通簽約app支付或者網頁支付功能,根據開發需求選擇簽約,這裡會收取手續費,按每筆交易收取不同比例費用,提交後需等待稽核完成,這個階段使用支付功能將會報insufficient-isv-permissions錯誤。遇到此錯誤等待稽核通過即可
上傳支付寶祕鑰,下載地址:https://docs.open.alipay.com/291/105971
下載好後開啟這個檔案:
生成成功開啟rsa_private_key_pkcs8.pem這個檔案,進行應用公鑰的上傳,會自動生成支付寶公鑰。
此時設定加密方式:如果沒有設定加密方式,你將會遇到app支付成功後,介面並不會呼叫回撥函式,這個地方一定要注意
接下來進入編碼階段:
/** * 支付寶支付配置 */ public class AlipayConfig { // 商戶appid public static String APP_ID = ""; // 支付寶公鑰 public static String ALIPAY_PUBLIC_KEY = ""; //應用私鑰 public static String APP_PRIVATE_KEY = ""; /** * 5.伺服器非同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問 */ public static String notify_url = "http://www.xxx.com/alipay/notify_url.do"; /** * 6.請求閘道器地址 */ public static String URL = "https://openapi.alipay.com/gateway.do"; /** * 7.編碼 */ public static String CHARSET = "UTF-8"; /** * 8.返回格式 */ public static String FORMAT = "json"; /** * 9.加密型別 */ public static String SIGNTYPE = "RSA2"; /** * 10.訂單有效日期 */ public static String TIMEOUT_EXPRESS = "7d"; public static String PRODUCT_CODE = "QUICK_MSECURITY_PAY"; /** * 支付回撥介面&充值餘額支付回撥介面 * 支付回撥地址只有一個 */ public static String NOTIFY_URL = ""; /** * 獲取訂單號的 key */ public static String OUT_TRADE_NO = "out_trade_no"; /** * 獲取交易狀態碼的 key */ public static String TRADE_STATUS = "trade_status"; /** * 字元常量 “TRADE_SUCCESS” */ public static String TRADE_SUCCESS = "TRADE_SUCCESS"; /** * 字元常量 “TRADE_FINISHED” */ public static String TRADE_FINISHED = "TRADE_FINISHED"; /** * 字元常量 “app_id” */ public static String APP_ID_NOTIFY = "app_id"; /** * 字元常量 “total_amount” */ public static String TOTAL_AMOUNT_NOTIFY = "total_amount"; /** * 字元常量 “total_amount” */ public static String SELLER_EMAIL_NOTIFY = "seller_email"; /** * 字元常量 “元” */ public static String YUAN = "元"; }
@RequestMapping(value="/alipay", method={RequestMethod.POST}) public Result alipay(@Valid OrderAlipayReq orderAlipayReq, HttpSession session,HttpServletRequest httpRequest){ Result result = new Result(); if(orderAlipayReq.getOrderId()==null){ logger.info("引數訂單號OrderId為空"); result.setCode(MessageContants.FAIL); result.setMessage("引數訂單號OrderId為空"); return result; } if(orderAlipayReq.getPrice()==null){ logger.info("引數訂單號Price為空"); result.setCode(MessageContants.FAIL); result.setMessage("引數訂單號Price為空"); return result; } MwOrder mwOrder = mwOrderRepository.findOne(orderAlipayReq.getOrderId()); if(mwOrder==null){ logger.info("根據OrderId查詢訂單資訊為空,此訂單不存在"); result.setMessage("此訂單不存在"+orderAlipayReq.getOrderId()); result.setCode(MessageContants.FAIL); return result; } //訂單ID 商品名稱 價格 AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE); /** * 建立web請求訊息 */ // AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest(); /** * 建立app請求訊息 */ AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); /** * 封裝業務引數 * SDK已經封裝掉了公共引數,這裡只需要傳入業務引數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 */ AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); String subject = orderAlipayReq.getMediaName(); String orderNo = mwOrder.getOrderNo(); String body = mwOrder.getOrderName(); /** * 查詢訂單資訊 */ // 支付訂單詳情 model.setBody(body); // 支付訂單標題 model.setSubject(subject); // 支付訂單編號 model.setOutTradeNo(orderNo); // 訂單超時時間 model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS); // 支付訂單金額 model.setTotalAmount("0.01"); // model.setTotalAmount(createOrder.getTotalAmount()); // 訂單程式碼 model.setProductCode(AlipayConfig.PRODUCT_CODE); request.setBizModel(model); logger.info("發起支付寶app成功,開始回撥"); //支付成功了,把訂單編號快取 // session.setAttribute("orderId",mwOrder.getOrderId()); // 回撥地址 request.setNotifyUrl(AlipayConfig.NOTIFY_URL); /** * 支付寶響應體 */ AlipayTradeAppPayResponse response = null; //這裡和普通的介面呼叫不同,使用的是sdkExecute try { response = alipayClient.sdkExecute(request); //處理支付後訂單資訊,上線後需放在回撥介面中 /* mwOrder.setOrderId(mwOrder.getOrderId()); //支付成功 "1",更新時間 //未支付狀態 mwOrder.setStatus("0"); mwOrder.setMediaOrderStatus("5"); mwOrder.setUpdateTime(DateUtils.getNowDate()); mwOrderRepository.save(mwOrder); */ //支付後向賬單表裡新增記錄 /* MwBill mwBill = new MwBill(); mwBill.setBillDescribe("支付寶消費"+orderAlipayReq.getPrice()); mwBill.setConsumeAmount("0.01"); mwBill.setConsumeTime(DateUtils.getNowDate()); mwBill.setUserId(mwOrder.getUserId()); mwBillRepository.save(mwBill);*/ } catch (AlipayApiException e) { //如果回撥失敗了 logger.info("支付失敗"); result.setCode(MessageContants.FAIL); result.setMessage("支付失敗"); logger.info(response.getBody()); result.setData(response.getBody()); e.printStackTrace(); return result; } logger.info("支付寶響應內容:{}",response.getBody()); result.setData(response.getBody()); result.setMessage("支付成功"); result.setCode(MessageContants.SUCCESS); return result; }
只要賬號資訊無誤,就能完成支付寶支付