會(huì)員支付要點(diǎn)

注冊中的同步和異步

會(huì)員注冊流程.png

登陸

移動(dòng)端登錄接口.png

聯(lián)合第三方登陸

第三方聯(lián)合登錄流程.png

混合開發(fā)技術(shù)

混合開發(fā)技術(shù).png

加密

安全加密.png

支付架構(gòu)流程

支付架構(gòu)流程.png

同步回調(diào)

@Slf4j
@RestController
public class PayCallBackServiceImpl extends BaseApiService implements PayCallBackService {
    @Autowired
    private PaymentInfoDao paymentInfoDao;

    // 同步回調(diào)
    public ResponseBase synCallBack(@RequestParam Map<String, String> params) {
        // 獲取支付寶GET過來反饋信息
        try {
            log.info("####同步回調(diào)開始####params:",params);
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key,
                    AlipayConfig.charset, AlipayConfig.sign_type); // 調(diào)用SDK驗(yàn)證簽名
            // ——請?jiān)谶@里編寫您的程序(以下代碼僅作參考)——
            if (!signVerified) {
                return setResultError("驗(yàn)簽失敗!");
            }
            // 商戶訂單號
            String out_trade_no = params.get("out_trade_no");
            // 支付寶交易號
            String trade_no = params.get("trade_no");
            // 付款金額
            String total_amount = params.get("total_amount");
            JSONObject data = new JSONObject();
            data.put("out_trade_no", out_trade_no);
            data.put("trade_no", trade_no);
            data.put("total_amount", total_amount);
            return setResultSuccess(data);
        } catch (Exception e) {
            log.info("######PayCallBackServiceImpl##ERROR:#####", e);
            return setResultError("系統(tǒng)錯(cuò)誤!");
        }finally{
            log.info("####同步回調(diào)結(jié)束####params:",params);
        }

    }

PayController同步回調(diào)隱藏get參數(shù)浴栽,get傳表單缘厢,表單里有post

// 同步回調(diào)
    @RequestMapping("/callBack/synCallBack")
    public void synCallBack(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        Map<String, String[]> requestParams = request.getParameterMap();
        Map<String, String> params = new HashMap<String, String>();
        for (Iterator<String> 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);
        }
        PrintWriter writer = response.getWriter();
        ResponseBase synCallBack = payCallBackFegin.synCallBack(params);
        if (!synCallBack.getRtnCode().equals(Constants.HTTP_RES_CODE_200)) {
            return;
        }

        LinkedHashMap data = (LinkedHashMap) synCallBack.getData();
        String htmlFrom = "<form name='punchout_form'"
                + " method='post' action='http://127.0.0.1/callBack/synSuccessPage' >"
                + "<input type='hidden' name='outTradeNo' value='" + data.get("out_trade_no") + "'>"
                + "<input type='hidden' name='tradeNo' value='" + data.get("trade_no") + "'>"
                + "<input type='hidden' name='totalAmount' value='" + data.get("total_amount") + "'>"
                + "<input type='submit' value='立即支付' style='display:none'>"
                + "</form><script>document.forms[0].submit();" + "</script>";
        writer.println(htmlFrom);
        writer.close();
    }

    // 同步回調(diào),解決隱藏參數(shù)
    @RequestMapping(value = "/callBack/synSuccessPage", method = RequestMethod.POST)
    public String synSuccessPage(HttpServletRequest request, String outTradeNo, String tradeNo, String totalAmount) {
        request.setAttribute("outTradeNo", outTradeNo);
        request.setAttribute("tradeNo", tradeNo);
        request.setAttribute("totalAmount", totalAmount);
        return PAY_SUCCESS;
    }

支付異步通知(其實(shí)和同步很像间护,多了冪等性判斷,和修改訂單)

    @Override
    public String asynCallBack(@RequestParam Map<String, String> params) {
        // 1.日志記錄
        log.info("#####支付寶異步通知synCallBack#####開始,params:{}", params);
        // 2.驗(yàn)簽操作
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key,
                    AlipayConfig.charset, AlipayConfig.sign_type); // 調(diào)用SDK驗(yàn)證簽名
            log.info("#####支付寶異步通知signVerified:{}######", signVerified);
            // ——請?jiān)谶@里編寫您的程序(以下代碼僅作參考)——
            if (!signVerified) {
                return Constants.PAY_FAIL;
            }
            // 商戶訂單號
            String outTradeNo = params.get("out_trade_no");
            // 調(diào)用訂單數(shù)據(jù)庫修改訂單表數(shù)據(jù)庫
            // 3 處理冪等
            PaymentInfo orderIdPayInfo = paymentInfoDao.getByOrderIdPayInfo(outTradeNo);
            if (orderIdPayInfo == null) {
                return Constants.PAY_FAIL;
            }
            // 判斷是否已經(jīng)支付過汁尺,如果已經(jīng)支付過,返回success,防止重試產(chǎn)生重復(fù)
            Integer state = orderIdPayInfo.getState();
            if (state == 1) {
                return Constants.PAY_SUCCESS;
            }

            // 支付寶交易號
            String tradeNo = params.get("trade_no");
            orderIdPayInfo.setState(1);
            orderIdPayInfo.setPlatformorderId(tradeNo);
            orderIdPayInfo.setPayMessage(params.toString());
            Integer updatePayInfo = paymentInfoDao.updatePayInfo(orderIdPayInfo);
            if (updatePayInfo <= 0) {
                return Constants.PAY_FAIL;
            }
            // 調(diào)用訂單接口通知修改訂單狀態(tài)
            ResponseBase ordeResponseBase = orderFegin.updateOrderId(1l, tradeNo, outTradeNo);
            if (!ordeResponseBase.getRtnCode().equals(Constants.HTTP_RES_CODE_200)) {
                return Constants.PAY_FAIL;
            }
            return Constants.PAY_SUCCESS;
        } catch (Exception e) {
            log.error("####支付寶異步通知出現(xiàn)異常,ERROR:", e);
            return Constants.PAY_FAIL;
        } finally {
            log.info("#####支付寶異步通知synCallBack#####結(jié)束,params:{}", params);
        }

分布式事務(wù)

分布式產(chǎn)生原因

分布式事物產(chǎn)生原因.png

2PC

兩段提交協(xié)議.png

圖片1.png

消息中間解決

消息中間解決分布式事物.png

CAP

  • 數(shù)據(jù)一致性(consistency):如果系統(tǒng)對一個(gè)寫操作返回成功狼荞,那么之后的讀請求都必須讀到這個(gè)新數(shù)據(jù);如果返回失敗拾积,那么所有讀操作都不能讀到這個(gè)數(shù)據(jù)拓巧,對調(diào)用者而言數(shù)據(jù)具有強(qiáng)一致性(strong consistency) (又叫原子性 atomic一死、線性一致性 linearizable consistency)[5]
  • 服務(wù)可用性(availability):所有讀寫請求在一定時(shí)間內(nèi)得到響應(yīng),可終止承耿、不會(huì)一直等待
  • 分區(qū)容錯(cuò)性(partition-tolerance):在網(wǎng)絡(luò)分區(qū)的情況下,被分隔的節(jié)點(diǎn)仍能正常對外服務(wù)

TCC
TCC(Try-Confirm-Cancel)瘩绒,則是將業(yè)務(wù)邏輯分成try锁荔、confirm/cancel兩個(gè)階段執(zhí)行其事務(wù)處理方式為:
1阳堕、 在全局事務(wù)決定提交時(shí)择克,調(diào)用與try業(yè)務(wù)邏輯相對應(yīng)的confirm業(yè)務(wù)邏輯;
2壹堰、 在全局事務(wù)決定回滾時(shí)骡湖,調(diào)用與try業(yè)務(wù)邏輯相對應(yīng)的cancel業(yè)務(wù)邏輯。 可見谆焊,TCC在事務(wù)處理方式上浦夷,是很簡單的:要么調(diào)用confirm業(yè)務(wù)邏輯,要么調(diào)用cancel邏輯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罐孝,一起剝皮案震驚了整個(gè)濱河市肾档,隨后出現(xiàn)的幾起案子辫继,更是在濱河造成了極大的恐慌,老刑警劉巖遣耍,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舵变,死亡現(xiàn)場離奇詭異,居然都是意外死亡赊豌,警方通過查閱死者的電腦和手機(jī)绵咱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艾恼,“玉大人钠绍,你說我怎么就攤上這事花沉。” “怎么了泻拦?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵忽媒,是天一觀的道長。 經(jīng)常有香客問我架曹,道長绑雄,這世上最難降的妖魔是什么奥邮? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮脚粟,結(jié)果婚禮上蘸朋,老公的妹妹穿的比我還像新娘。我一直安慰自己团南,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布正歼。 她就那樣靜靜地躺著拷橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞奋,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天轿塔,我揣著相機(jī)與錄音,去河邊找鬼揍障。 笑死俩由,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兜畸。 我是一名探鬼主播碘梢,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煞躬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了在扰?” 一聲冷哼從身側(cè)響起复唤,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妓局,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體好爬,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡存炮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年穆桂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灼芭。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彼绷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寄悯,到底是詐尸還是另有隱情堕义,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布昔馋,位于F島的核電站糖耸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邦危。R本人自食惡果不足惜舍扰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一边苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦聊疲、人聲如沸沪悲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涉馁。三九已至,卻和暖如春固歪,著一層夾襖步出監(jiān)牢的瞬間胯努,已是汗流浹背叶沛。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工忘朝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溉箕。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓悦昵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寡痰。 傳聞我的和親對象是個(gè)殘疾皇子棋凳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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