支付寶服務商模式下的支付開發

微信的服務商模式開發,文檔有很明確的說明,也有詳細的開發文檔,以及操作步驟。其實支付寶也是支付服務商模式的,只是比較影藏,今天在這裏梳理一下。

 

一、如何選擇支付類型??

在實現支付寶支付的時候,我們要先選擇一種支付方式,這裏和微信是一樣的。

 一般的作爲後臺開發者,我們首選手機網站支付,因爲這個不僅是H5頁面可以發起支付,以後也可以嵌套在APP裏面,這樣APP就不用二次開發了。

但是坑來了,當我們打開當面付的api以後,就會發現問題了。

 

如上圖:

手機網站支付是不支持第三方調用的,但是當面付可以。換句話說,就是手機網站支付不支持服務商,當面付才支持服務商模式。

好長時間才發現,這個坑。

 

二、如何替商戶發起支付??

好了,那麼對接完當面付之後,如何替商戶發起支付呢??ok,看文檔

https://opendocs.alipay.com/apis/api_1/alipay.trade.pay

seller_id:賣方PID

如果該值爲空,則默認爲商戶簽約賬號對應的支付寶用戶ID

這是很含蓄的表達:意思就是如果爲空,默認就是服務商的PID,不爲空,纔是商戶的

找到途徑之後,我們就只需要找到滿足條件的商戶PID,就可以完成支付了。

 

三、如何發展商戶?

1、登錄網址:https://p.alipay.com/workspace/home

2、運營中心-->商家簽約管理

在這裏幫你的商戶,簽約當面付,這裏簽約的時候,費率一定要填寫0.6%,因爲這裏有驚喜哦^-^

簽約成功之後,客戶會收到簽約確認郵件,登錄確認就好。

3、客戶授權

官方文檔:https://opendocs.alipay.com/open/20160728150111277227/intro

這裏一定要注意:授權支付寶賬號和之前簽約的支付寶賬號一定要是同一個

授權成功之後,在會在“我的商家”裏面顯示出來。

 

好了,準備工作到這裏,基本上就可以實現服務商模式支付。簽約的費率爲什麼要選擇0.6%,因爲支付寶的政策和微信的政策是一樣的,我就不具體說明了,你懂的。。。。

 

四、業務擴展

聊點題話外,支付寶在這裏還預留了業務擴展參數,這個可以根據自己和支付寶合作,而具體判斷。

 這裏附上代碼片段,有需要的同學,可以參考。

	public String exe(PayOrder payOrder, String aliAppid, String rsaPrivateKey, String alipayPublicKey, String detail, double chargeMoney,
			String body, String sellerId, String userId, int isSpAliPay, Punit punit) {
		String out_trade_no = payOrder.getPayOrderId();

		// 調用支付寶sdk,生成訂單
		AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, aliAppid, rsaPrivateKey, AlipayConfig.FORMAT, AlipayConfig.CHARSET,
				alipayPublicKey, AlipayConfig.SIGNTYPE);
		AlipayTradeCreateRequest alipay_request = new AlipayTradeCreateRequest();

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("out_trade_no", out_trade_no);
		map.put("subject", detail);
		map.put("total_amount", chargeMoney);
		map.put("body", body);
		map.put("seller_id", sellerId);
		map.put("buyer_id", userId); // 買家pid
		map.put("timeout_express", "10m"); // 最晚支付時間10分鐘

		// 德立雲參數
		 String sys_service_provider_id = Config.ALIPAY_PID;
		 String alipayParkingId = punit.getAlipayParkingId(); // 支付寶停車場

		// 雲縱參數
		try {
			PunitExternal punitExternal = punitExternalDBService.findByPunitId(payOrder.getPunitId());
			if (punitExternal != null && !StringUtils.isEmpty(punitExternal.getParkingId())) {
				sys_service_provider_id = Config.YUNZOU_PID;
				alipayParkingId = punitExternal.getParkingId(); // 支付寶停車場
			}
		} catch (Exception e1) {
			LOG.error("獲取停車場合作參數失敗", e1);
		}

		// extendParams參數
		Map<String, Object> extendParamsMap = new HashMap<String, Object>();
		extendParamsMap.put("sys_service_provider_id", sys_service_provider_id);
		if (!StringUtils.isEmpty(alipayParkingId)) {
			// promo_params參數
			Map<String, Object> promoParamsMap = new HashMap<String, Object>();
			promoParamsMap.put("parking_id", alipayParkingId);
			map.put("promo_params", promoParamsMap);

			// refluxInfo參數
			Map<String, Object> refluxInfoMap = new HashMap<String, Object>();
			Map<String, Object> sceneDataMap = new HashMap<String, Object>();
			refluxInfoMap.put("scene_code", "parking_fee_order");
			refluxInfoMap.put("channel", "common_park_provider");
			sceneDataMap.put("license_plate", payOrder.getPlateNum());
			sceneDataMap.put("start_time", payOrder.getInTime());
			sceneDataMap.put("parking_lot_id", alipayParkingId);
			sceneDataMap.put("parkling_lot_name", punit.getUnitName());
			sceneDataMap.put("city_code", punit.getCity());
			refluxInfoMap.put("scene_data", sceneDataMap);
			String refluxInfoString = JSONObject.fromObject(refluxInfoMap).toString();
			extendParamsMap.put("industry_reflux_info", refluxInfoString);
		}
		map.put("extend_params", extendParamsMap);

		// 必須傳遞,生成訂單之後,用H5調起支付寶
		if (isSpAliPay == 1) {
			// 獲取授權token
			String authToken = getAlipayOpenAuthTokenAppBo.getAuthToken(sellerId);
			if (StringUtils.isEmpty(authToken)) {
				LOG.error("alipay_支付寶獲取authToken失敗,sellerId=" + sellerId);
				return null;
			}
			alipay_request.putOtherTextParam("app_auth_token", authToken);
		}
		alipay_request.setBizContent(JSONObject.fromObject(map).toString());

		// 設置異步通知地址
		alipay_request.setNotifyUrl(AlipayConfig.notify_url);
		// 設置同步地址
		alipay_request.setReturnUrl(AlipayConfig.return_url);

		AlipayTradeCreateResponse response = null;
		try {
			response = client.execute(alipay_request);
		} catch (AlipayApiException e) {
			LOG.error("alipay_支付寶下單失敗");
		}
		LOG.info("alipay_下單成功,response=" + JSONObject.fromObject(response).toString());

		// 返回參數jsapi 需要的參數
		return response.getTradeNo(); // 交易號
	}

JSAPI支付地址:https://opendocs.alipay.com/open/common/105591

好了,到這裏支付寶服務商模式支付,已經完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章