微信公眾號支付開發全過程(Java 版)

歐陽思海發表於2018-07-08

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。

一、微信官方文件微信支付開發流程(公眾號支付)

首先我們到微信支付的官方文件的開發步驟部分檢視一下需要的設定。 [圖片上傳失敗...(image-5eb825-1531014079742)]

因為微信支付需要較高的許可權,只有認證了得服務號才有使用微信支付介面的許可權,我們個人很難申請到,所以需要向其他朋友借用賬號。

來到文件的業務流程部分,檢視微信支付的流程(我覺得這個還是需要十分仔細的瞭解和檢視的,這有助於你理解微信開發的流程)。

這裡寫圖片描述

然後,訪問微信支付介面是要傳遞的引數很多,見統一下單 [圖片上傳失敗...(image-df7051-1531014079742)]

通過檢視上面的這些微信支付的官方文件之後,我相信你對這些應該有了一定的瞭解了,但是還是覺得微信支付的開發十分的麻煩,所以我們接下來使用第三方的sdk來開發。

二、微信支付第三方sdk開發(公眾號支付)

這個是公眾號支付,我們使用**best-pay-sdk**,這個SDK使用PayRequestPayResponse對請求介面和相應結果做了大量的封裝,主要需要動態傳入的引數是openid(使用者唯一標識)和orderId。接下來我們看看如何開發。

1、配置

 //微信公眾賬號支付配置
    WxPayH5Config wxPayH5Config = new WxPayH5Config();
    wxPayH5Config.setAppId("xxxxx");
    wxPayH5Config.setAppSecret("xxxxxxxx");
    wxPayH5Config.setMchId("xxxxxx");
    wxPayH5Config.setMchKey("xxxxxxx");
    wxPayH5Config.setNotifyUrl("http://xxxxx");
            
    //支付類, 所有方法都在這個類裡
    BestPayServiceImpl bestPayService = new BestPayServiceImpl();
    bestPayService.setWxPayH5Config(wxPayH5Config);
複製程式碼

2、發起支付

  PayRequest payRequest = new PayRequest();
     payRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
     payRequest.setOrderId("123456");
     payRequest.setOrderName("微信公眾賬號支付訂單");
     payRequest.setOrderAmount(0.01);
     payRequest.setOpenid("openid_xxxxxx");
     bestPayService.pay(payRequest);
複製程式碼

3、非同步回撥

  bestPayService.asyncNotify();
複製程式碼

這就是這個sdk所說的10行程式碼解決微信支付。

支付完成後,微信會返回給把支付結果以一段支付xml的資料返回給我們,我們需要將這段資料傳遞給非同步通知url(notify_url),來完成支付結果的驗證(驗證簽名,驗證支付狀態),這兩步SDK都為我們做好了,只需這樣呼叫bestPayService.asyncNotify(notifyData);,完成驗證後,我們需要返回給微信這樣一段資料:

<xml>

  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
</xml>
複製程式碼

告訴微信已完成驗證,不要再給我們傳送非同步通知的請求。

是不是還是不太清楚如何整合到專案?沒關係,這個還有示例demo,可以更加明瞭的清楚。

三、demo執行

demo網址為:https://github.com/Pay-Group/best-pay-demo

我們最主要的controller放在這裡:

@Controller
@Slf4j
public class PayController {

    @Autowired
    private BestPayServiceImpl bestPayService;

    /**
     * 發起支付
     */
    @GetMapping(value = "/pay")
    public ModelAndView pay(@RequestParam("openid") String openid,
                            Map<String, Object> map) {
        PayRequest request = new PayRequest();
        Random random = new Random();

        //支付請求引數
        request.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
        request.setOrderId(String.valueOf(random.nextInt(1000000000)));
        request.setOrderAmount(0.01);
        request.setOrderName("最好的支付sdk");
        request.setOpenid(openid);
        log.info("【發起支付】request={}", JsonUtil.toJson(request));

        PayResponse payResponse = bestPayService.pay(request);
        log.info("【發起支付】response={}", JsonUtil.toJson(payResponse));

        map.put("payResponse", payResponse);

        return new ModelAndView("pay/create", map);
    }

    /**
     * 非同步回撥
     */
    @PostMapping(value = "/notify")
    public ModelAndView notify(@RequestBody String notifyData) throws Exception {
        log.info("【非同步回撥】request={}", notifyData);
        PayResponse response = bestPayService.asyncNotify(notifyData);
        log.info("【非同步回撥】response={}", JsonUtil.toJson(response));

        return new ModelAndView("pay/success");
    }


}
複製程式碼

這個可以自己去下載就可以,下面看一下一下如何執行

專案說明

需要在Jdk版本>1.8上執行 本專案採用SpringBoot1.5.1開發

專案結構

src/main/java/com/github/lly835
├── PayDemoApplication.java    
├── ServletInitializer.java
├── config
│   └── PayConfig.java       //支付金鑰配置類
└── controller
    └── PayController.java   //支付呼叫
複製程式碼

執行示例

執行前需要先配置好金鑰, 見PayConfig.java 執行命令

git clone https://github.com/Pay-Group/best-pay-demo
cd best-pay-demo
mvn clean package
java -jar target/*.war
複製程式碼

瀏覽器訪問http://127.0.0.1:8080/pay

相關文章