[Java] 服務(wù)端實(shí)現(xiàn) 支付寶/微信 登錄/支付/轉(zhuǎn)賬

吐槽一下, 簡(jiǎn)書內(nèi)容沒有自帶目錄, 且中間內(nèi)容區(qū)域太窄

集成

支付寶

  • 開發(fā)者應(yīng)用配置
  • Maven 依賴
<!-- 支付寶 -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.34.47.ALL</version>
</dependency>
  • yml配置
alipay: # 支付寶配置
  appid: 123
  ...

微信支付

微信登錄/分享社交類 和 微信支付是分開的

微信支付 所有示例都在 https://github.com/wechatpay-apiv3/wechatpay-java/blob/main/service/src/example, 請(qǐng)自由查看

SDK https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

  • Maven 依賴
<!-- 微信 https://github.com/wechatpay-apiv3/wechatpay-java -->
<dependency>
  <groupId>com.github.wechatpay-apiv3</groupId>
  <artifactId>wechatpay-java</artifactId>
  <version>0.2.1</version>
</dependency>
  • yml配置
wechatpay: # 微信支付配置
  appid: 123
  ...

登錄

支付寶

目前廣泛應(yīng)用于支付寶用戶在合作商家端的快速登錄場(chǎng)景和支付寶開放業(yè)務(wù)的免登錄使用場(chǎng)景等。[1]

先獲取 token, 再獲取用戶信息

  1. alipay.system.oauth.token(換取授權(quán)訪問令牌) https://opendocs.alipay.com/open/02ailc?ref=api
  2. alipay.user.info.share(支付寶會(huì)員授權(quán)信息查詢接口) https://opendocs.alipay.com/open/02aild?ref=api

微信

移動(dòng)應(yīng)用微信登錄開發(fā)指南 https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

支付

支付寶

外部商戶APP喚起快捷SDK創(chuàng)建訂單并支付[2]

alipay.trade.app.pay(app支付接口2.0) https://opendocs.alipay.com/open/02e7gq?ref=api&scene=20

微信

商戶系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單,返回正確的預(yù)支付交易會(huì)話標(biāo)識(shí)后再按Native浪慌、JSAPI东臀、APP等不同場(chǎng)景生成交易串調(diào)起支付追他。

APP下單API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml

轉(zhuǎn)賬

支付寶

轉(zhuǎn)賬到支付寶賬戶是為了滿足支付寶商家向其他支付寶賬戶進(jìn)行單筆轉(zhuǎn)賬的需求圆仔,針對(duì)具備開發(fā)能力的商家勒奇,提供通過 API 接口完成單筆轉(zhuǎn)賬的功能直秆。商家只需輸入另一個(gè)正確的支付寶賬號(hào)濒募,即可將資金從本企業(yè)支付寶賬戶轉(zhuǎn)賬至另一個(gè)支付寶賬戶。 該產(chǎn)品適用行業(yè)較廣圾结,可用于商家間的貨款結(jié)算瑰剃、轉(zhuǎn)賬匯款,商家給企業(yè)或個(gè)人發(fā)放傭金等筝野。[3]

支付寶提供的站內(nèi)轉(zhuǎn)賬功能晌姚,需要商家登錄支付寶網(wǎng)站進(jìn)行操作。部分擁有自身業(yè)務(wù)系統(tǒng)(如 CRM歇竟、ERP 等)的商家挥唠,希望支付寶提供轉(zhuǎn)賬接口,與自身業(yè)務(wù)系統(tǒng)直接對(duì)接實(shí)現(xiàn)轉(zhuǎn)賬功能焕议,而不是頻繁登錄支付寶網(wǎng)站轉(zhuǎn)賬宝磨。為解決上述問題,支付寶為具備開發(fā)能力的商家提供了轉(zhuǎn)賬到支付寶賬戶產(chǎn)品盅安,滿足了商家通過接口集成唤锉,由商家自身業(yè)務(wù)系統(tǒng)完成支付寶轉(zhuǎn)賬功能的需求。[3]

alipay.fund.trans.uni.transfer(單筆轉(zhuǎn)賬接口) https://opendocs.alipay.com/open/02byuo

    public void transfer(String payeeIdentity, String payeeInfoIdentityType, String payeeName,
                         String outBizNo, String transAmount,
                         String orderTitle, String remark) throws AlipayApiException {

        CertAlipayRequest alipayConfig = new CertAlipayRequest();
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setServerUrl(serverUrl);
        alipayConfig.setAppId(appId);
        alipayConfig.setFormat(format);
        alipayConfig.setCharset(charset);
        alipayConfig.setSignType(signType);
        alipayConfig.setCertPath(certPath);
        alipayConfig.setAlipayPublicCertPath(alipayPublicCertPath);
        alipayConfig.setRootCertPath(rootCertPath);

        Participant payeeInfo = new Participant();
        payeeInfo.setIdentity(payeeIdentity);
        payeeInfo.setIdentityType(payeeInfoIdentityType);
        payeeInfo.setName(payeeName);

        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
        model.setPayeeInfo(payeeInfo);
        model.setOutBizNo(outBizNo);
        model.setTransAmount(transAmount);
        model.setProductCode(productCode);
        model.setBizScene(bizScene);
        model.setOrderTitle(orderTitle);
        model.setRemark(remark);
        model.setBusinessParams(businessParams);

        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        request.setBizModel(model);

        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);

        if (response.isSuccess()) {
            System.out.println("調(diào)用成功");
            String responseOutBizNo = response.getOutBizNo();
            String responseOrderId =  response.getOrderId();
            String responsePayFundOrderId = response.getPayFundOrderId();
            String responseTransDate =  response.getTransDate();

        } else {
            System.out.println("調(diào)用失敗");
        }
    }

微信

商戶可以通過該接口同時(shí)向多個(gè)用戶微信零錢進(jìn)行轉(zhuǎn)賬操作宽堆。

發(fā)起商家轉(zhuǎn)賬API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml

異步通知

支付寶

異步通知說明 https://opendocs.alipay.com/open/204/105301

    @ApiOperation("支付寶異步通知")
    @PostMapping("/alipay_async")
    public String alipay_async(HttpServletRequest request) {
        Map requestParams = request.getParameterMap();

        //獲取支付寶POST過來反饋信息腌紧,將異步通知中收到的待驗(yàn)證所有參數(shù)都存放到map中
        Map<String, String> params = new HashMap<>();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            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);
        }

        try {
            //調(diào)用SDK驗(yàn)證簽名
            //公鑰驗(yàn)簽示例代碼
            boolean signVerified = AlipaySignature.rsaCheckV1(params, "ALIPAY_PUBLIC_KEY", "CHARSET", "sign_type");
            //公鑰證書驗(yàn)簽示例代碼
            //boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");
            if (signVerified) {
                // TODO 驗(yàn)簽成功后
                //按照支付結(jié)果異步通知中的描述,對(duì)支付結(jié)果中的業(yè)務(wù)內(nèi)容進(jìn)行1\2\3\4二次校驗(yàn)号胚,校驗(yàn)成功后在response中返回success
            } else {
                // TODO 驗(yàn)簽失敗則記錄異常日志籽慢,并在response中返回fail.
                return "fail";
            }
        } catch (AlipayApiException e) {
            //throw new RuntimeException(e);
            return "fail";
        }
        return "success";
    }

微信

微信支付通過支付通知接口將用戶支付成功消息通知給商戶

支付通知API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_5.shtml


  1. https://opendocs.alipay.com/open/218/105329 ?

  2. https://opendocs.alipay.com/open/02e7gq?scene=common ?

  3. https://opendocs.alipay.com/open/309/106235?ref=api ? ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猫胁,隨后出現(xiàn)的幾起案子箱亿,更是在濱河造成了極大的恐慌,老刑警劉巖弃秆,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届惋,死亡現(xiàn)場(chǎng)離奇詭異髓帽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脑豹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門郑藏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘩欺,你說我怎么就攤上這事必盖。” “怎么了俱饿?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歌粥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我拍埠,道長(zhǎng)失驶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任械拍,我火速辦了婚禮突勇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坷虑。我一直安慰自己甲馋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布迄损。 她就那樣靜靜地躺著定躏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芹敌。 梳的紋絲不亂的頭發(fā)上痊远,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音氏捞,去河邊找鬼碧聪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛液茎,可吹牛的內(nèi)容都是我干的逞姿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼捆等,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼滞造!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栋烤,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谒养,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后明郭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體买窟,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰泊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了始绍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁耗。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疆虚,靈堂內(nèi)的尸體忽然破棺而出苛败,到底是詐尸還是另有隱情,我是刑警寧澤径簿,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布罢屈,位于F島的核電站,受9級(jí)特大地震影響篇亭,放射性物質(zhì)發(fā)生泄漏缠捌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一译蒂、第九天 我趴在偏房一處隱蔽的房頂上張望曼月。 院中可真熱鬧,春花似錦柔昼、人聲如沸哑芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聪姿。三九已至,卻和暖如春乙嘀,著一層夾襖步出監(jiān)牢的瞬間末购,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工虎谢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盟榴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓婴噩,卻偏偏與公主長(zhǎng)得像擎场,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讳推,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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