java服務(wù)端快速集成支付寶和微信支付

github 地址:https://github.com/alansun2/happyframework-pay

開發(fā)項(xiàng)目必須為spring項(xiàng)目

1. 使用

1.1. 如何集成到項(xiàng)目中惑惶?

  1. git clone 此項(xiàng)目择懂,進(jìn)入目錄癌椿,使用以下 maven 命令打成 jar 包:

    mvn clean install
    

    相應(yīng)的在 pom.xml 中加入如下依賴:

    <dependency>
        <groupId>com.alan344</groupId>
        <artifactId>happyframework-pay</artifactId>
        <version>1.5.0-SNAPSHOT</version>
    </dependency>
    
  2. @EnablePay 注解放到有 @SpringBootApplication/@Configuration 的地方;

  3. 把以下內(nèi)容,放入application.properties/yml并修改為你自己的微信或支付寶信息即可(有默認(rèn)值的可以不填);

    pay:
      alipay:
        app-id: ggg #應(yīng)用appid
        private-key: ccc #商戶的私鑰。表示一個(gè)路徑缰猴,示例:/root/a/private-key
        gateway-url: ggg #選填。 默認(rèn):https://openapi.alipay.com/gateway.do
        open-public-key: eee #開放平臺(tái)支付寶公鑰 表示一個(gè)路徑疤剑,示例:/root/a/private-key
        notify-url: fff #支付回調(diào)地址
        input-charset: aaa #選填滑绒,默認(rèn):UTF-8 
        sign-type: bbb #選填,默認(rèn):RSA2
        time-out: 默認(rèn):30m 
      wechat:
        spbill-create-ip: bbb #調(diào)用接口的ip
        notify-url: ddd #微信支付回調(diào)地址
        mch-app-id-map: #與商戶號(hào)綁定的appid或小程序appid隘膘,默認(rèn)使用第一個(gè)支付
          1: ddd
          2: eee
        mch-map: #商戶號(hào)信息疑故,默認(rèn)第一個(gè)為primary
          1: 
            mch-id: fff #商戶號(hào)
            public-key: ggg #微信RSA公鑰。表示一個(gè)路徑弯菊,示例:/root/a/private-key
            sign-key: hhh #用戶md5簽名纵势。表示一個(gè)路徑,示例:/root/a/private-key
            ca: iii #ca證書地址管钳。表示一個(gè)路徑钦铁,示例:/root/a/private-key
            ca-code: jjj #ca證書的密匙。表示一個(gè)路徑才漆,示例:/root/a/private-key
          2: 
            mch-id: fff #商戶號(hào)
            public-key: ggg #微信RSA公鑰牛曹。表示一個(gè)路徑,示例:/root/a/private-key
            sign-key: hhh #用戶md5簽名醇滥。表示一個(gè)路徑黎比,示例:/root/a/private-key
            ca: iii #ca證書地址。表示一個(gè)路徑鸳玩,示例:/root/a/private-key
            ca-code: jjj #ca證書的密匙阅虫。表示一個(gè)路徑,示例:/root/a/private-key
    

alipay:

  • app-id: 應(yīng)用appid
  • sign-type: 支付寶推薦使用RSA2不跟,這里不填默認(rèn)RSA2
  • private-key: 商戶的私鑰书妻。表示一個(gè)路徑,示例:/root/a/private-key
  • open-public-key:開放平臺(tái)支付寶公鑰 表示一個(gè)路徑躬拢,示例:/root/a/private-key
  • notify-url: fff #支付的默認(rèn)回調(diào)地址,包括app见间,掃碼等

你需要填寫的主要有:app-id聊闯,private-key,open-public-key米诉,notify-url

wechat:

  • spbill-create-ip: 調(diào)用接口的ip
  • notify-url: ddd #微信支付回調(diào)地址
  • mch-app-id-map: 與商戶號(hào)綁定的appid或小程序appid菱蔬,主要用于轉(zhuǎn)賬到微信零錢,默認(rèn)使用第一個(gè)appid進(jìn)行支付,退款拴泌,查詢訂單

    該屬性為一個(gè)map魏身,key為Integer,value為String

    • mch-map: 商戶號(hào)信息蚪腐,默認(rèn)第一個(gè)為primary

    該屬性為一個(gè)map箭昵,key為Integer,value為WechatMch

    • mch-id: 商戶號(hào)
    • public-key: 微信RSA公鑰回季。表示一個(gè)路徑家制,示例:/root/a/private-key
    • sign-key: 用戶md5簽名。表示一個(gè)路徑泡一,示例:/root/a/private-key
    • ca: ca證書地址颤殴。表示一個(gè)路徑,示例:/root/a/private-key
    • ca-code: ca證書的密匙鼻忠。表示一個(gè)路徑涵但,示例:/root/a/private-key

1.2. 如何使用

  1. PayUtils:支持支付、退款帖蔓、查詢訂單操作
  2. TransferAccountsUtils:支持轉(zhuǎn)賬操作(包括轉(zhuǎn)賬到零錢和銀行卡(支付寶未開放轉(zhuǎn)賬到銀行卡接口))

2. 使用示例

2.1. 支付

支付寶

OrderPay order = new OrderPay();
order.setBody("肥仔快樂水");
order.setPrice("3.25");
order.setSubject("盒馬生鮮");
order.setOrderId("sadfasdfas234234");
PayUtils.createPayInfo(order);

微信

OrderPay order = new OrderPay();
order.setBody("肥仔快樂水");
order.setPrice("3.25");
order.setOrderId("sadfasdfas234234");
order.setPayType(PayBase.PAY_TYPE_2);
// tradeType 默認(rèn)是 APP矮瘟,如果要使用小程序支付,需要修改
orderPay.setTradeType(BaseConstants.OS_WX == os ? TradeTypeEnum.APPLET : TradeTypeEnum.APP);
// 小程序支付需要設(shè)置 openid
orderPay.getWechatPayOrder().setOpenid(request.getOpenId());
// 選擇你配置文件中配置的商戶號(hào)對(duì)應(yīng)的序號(hào)讨阻,也就是說芥永,你可以配置多個(gè)商戶號(hào)信息來選擇,默認(rèn):1
orderPay.getWechatPayOrder().setMchNo(1);
PayUtils.createPayInfo(order);

或者 body 可以使用 bodyProducts 來設(shè)置钝吮,如下:

OrderPay order = new OrderPay();
order.setBodyProducts(bodyProducts);
...
...
PayUtils.createPayInfo(order);

使用 bodyProducts 的前提是 bodyProducts 必須實(shí)現(xiàn) Product 接口埋涧。notify_url 只要在上面的配置文件中配置了,這里就不需要設(shè)置了奇瘦。

另外對(duì)于支付寶/微信的回調(diào)棘催,這里我也做了簡單的封裝,你需要做的就是實(shí)現(xiàn) ConcretePayService 寫你的業(yè)務(wù)邏輯就可以了耳标。具體的做法:

/**
 * 支付寶回調(diào)
 *
 * @param request re
 */
@PostMapping(value = "verifyAlipayCallback")
public void verifyAlipayCallback(HttpServletRequest request, HttpServletResponse response) {
    AlipayCallbackHandler.getInstance().handler(request, response, sysConfig.getProfile().equals("pro"), payService);
}

/**
 * 微信回調(diào)
 *
 * @param request re
 */
@PostMapping(value = "verifyWXPayCallback")
public void verifyWXPayCallback(HttpServletRequest request, HttpServletResponse response) {
    WechatCallbackHandler.getInstance().handler(request, response, sysConfig.getProfile().equals("pro"), payService);
}

上面的例子中 payService 實(shí)現(xiàn)了 ConcretePayService 接口醇坝。

2.2. 查詢支付狀態(tài)

當(dāng)前端調(diào)起支付并支付成功后,前端可以調(diào)用后臺(tái)的該接口來獲取支付是否真的成功次坡。如果成功后臺(tái)可以做相應(yīng)的處理呼猪。

OrderQuery orderQuery = new OrderQuery();
orderQuery.setOrderId("sadfasdfas234234");
// PayBase.PAY_TYPE_1:支付寶;PayBase.PAY_TYPE_2:微信砸琅。默認(rèn):PayBase.PAY_TYPE_1
orderQuery.setPayType(PayBase.PAY_TYPE_2);
PayUtils.queryOrder(orderQuery);

2.3. 生成二維碼

主要用于生成二維碼供用戶掃碼支付宋距。這個(gè)接口的調(diào)用和 2.1 差不多,只是多了一個(gè) storeId 來記錄是那一臺(tái)設(shè)備生成的症脂。

2.4. 查詢訂單是否支付成功

這個(gè)接口的調(diào)用參數(shù)和 2.2 一樣谚赎。是 2.2 的一個(gè)特例淫僻,主要是為了方便查詢訂單是否支付成功

2.5 退款

支付寶

OrderRefund refundOrder = new OrderRefund();
refundOrder.setOrderId("sadfasdfas234234");
refundOrder.setRefundId("uniquesfsdfsdfsd");
refundOrder.setRefundAmount("1.23");
refundOrder.setTotalAmount("3.23");
refundOrder.setRefundReason("假貨");
// 可選參數(shù),默認(rèn)是人民幣
refundOrder.setRefundCurrency("USD");
PayUtils.refund(refundOrder);

另外你還可以通過 OrderRefund.alipayTradeRefundModel 屬性進(jìn)行自定義設(shè)置支付寶的參數(shù)壶唤。

微信

OrderRefund refundOrder = new OrderRefund();
refundOrder.setOrderId("sadfasdfas234234");
refundOrder.setRefundId("uniquesfsdfsdfsd");
refundOrder.setRefundAmount("1.23");
refundOrder.setTotalAmount("3.23");
refundOrder.setRefundReason("假貨");
refundOrder.setRefundCurrency("CNY");
refundOrder.setPayType(PayBase.PAY_TYPE_2);
// 以下為可選項(xiàng)
WeChatRefundInfo weChatRefundInfo = refundOrder.getWeChatRefundInfo();
weChatRefundInfo.setMchNo(1);// 配置的商戶號(hào)信息雳灵,默認(rèn):1
weChatRefundInfo.setMchAppIdNo(1);// 配置的 appid,默認(rèn):1
weChatRefundInfo.setNotifyUrl("http://www.baidu.com");// 異步通知 url闸盔,其實(shí)結(jié)果是實(shí)時(shí)返回的悯辙,不配置也是可以的
PayUtils.refund(refundOrder);

resultCode == SUCCESS 表示退款成功,如果返回 FAIL 或出現(xiàn)異常則退款失敗蕾殴,你需要定時(shí)的去處理這些退款失敗的訂單笑撞。

2.6. 轉(zhuǎn)賬到余額/零錢

支付寶

TransferMoneyInternal params = new TransferMoneyInternal();
params.setTransferId("sdfsdf");
params.setPayeeAccount("18658254585");
params.setAmount("100");
//以下為可選項(xiàng)
params.setReUserName("張三");
params.setDesc("轉(zhuǎn)賬測試");
TransferAccountsUtils.transferMoneyInternal(params);

還可以通過 TransferMoneyInternal.fundTransToaccountTransferModel 配置支付寶的轉(zhuǎn)賬信息。

微信

TransferMoneyInternal params = new TransferMoneyInternal();
params.setTransferId("sdfsdf");
params.setPayeeAccount("18658254585");
params.setAmount("100");
params.setPayType(PayBase.PAY_TYPE_2);
//以下為可選項(xiàng)
params.setReUserName("張三");
params.setDesc("轉(zhuǎn)賬測試");
TransferAccountsUtils.transferMoneyInternal(params);

2.7. 轉(zhuǎn)賬到銀行卡

只支持微信钓觉,支付寶沒開放此接口茴肥。

TransferToBankCardParams params = new TransferToBankCardParams();
params.setPartnerTradeNo("sdfsfsdf");
params.setEncTrueName("張三");
params.setEncBankNo("62223234235623423423");
params.setBankCode("1002");
params.setAmount("0.1");
// 以下為可選
params.setDesc("測試銀行卡轉(zhuǎn)賬");
params.setMchAppIdNo(1);
params.setMchNo(1);
TransferAccountsUtils.transferToBankCard(params);

2.8. 查詢轉(zhuǎn)賬到銀行卡

2.7 有可能返回 PROCESSING 對(duì)于這些訂單你需要定時(shí)去查詢這些訂單的狀態(tài),知道這些狀態(tài)為最終狀態(tài)荡灾。

2.9. 查詢轉(zhuǎn)賬到余額/零錢

It's all!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓤狐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子批幌,更是在濱河造成了極大的恐慌础锐,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荧缘,死亡現(xiàn)場離奇詭異皆警,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)截粗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門信姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绸罗,你說我怎么就攤上這事意推。” “怎么了珊蟀?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵菊值,是天一觀的道長。 經(jīng)常有香客問我育灸,道長腻窒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任磅崭,我火速辦了婚禮定页,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绽诚。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布恩够。 她就那樣靜靜地躺著卒落,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜂桶。 梳的紋絲不亂的頭發(fā)上儡毕,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音扑媚,去河邊找鬼腰湾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疆股,可吹牛的內(nèi)容都是我干的费坊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼旬痹,長吁一口氣:“原來是場噩夢啊……” “哼附井!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起两残,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤永毅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后人弓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼死,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年崔赌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了意蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峰鄙,死狀恐怖浸间,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吟榴,我是刑警寧澤魁蒜,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站吩翻,受9級(jí)特大地震影響兜看,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狭瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一细移、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熊锭,春花似錦弧轧、人聲如沸雪侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速缨。三九已至,卻和暖如春代乃,著一層夾襖步出監(jiān)牢的瞬間旬牲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工搁吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留原茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓堕仔,卻偏偏與公主長得像擂橘,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贮预,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容