1. 程式人生 > >微信掃碼支付(模式一)遇到的那些坑

微信掃碼支付(模式一)遇到的那些坑

在這個二維碼風起雲湧的時代,線上支付已經成為潮流,沒事掃一掃,打賞一下我也不介意。

timg.jpg

醞釀

談坑之前先聊一聊模式一的大體流程,模式一的適用場景一般為自助售賣機或者固定價格的商品的線下交易居多。

當然我能想象到的線上交易,比如,對於固定價格的商品進行支付,由商戶交易回撥中設定簡訊或者郵件啟用碼之類的做驗證。

感覺模式一更像是一個無狀態的支付,二維碼中的資訊可用的只有product_id而已,對於使用者-訂單來說並沒有任何關聯。

如果小夥伴們有類似使用場景,還望告知。

生成二維碼

首先根據商品ID以及其他資訊,由商戶後臺生成二維碼。

引數列表

123.png

部分程式碼

  1. /**
  2. * 二維碼生成器(掃碼支付模式一)
  3. * 建立者 小柒2012
  4. * 建立時間 2017年8月2日
  5. */
  6. publicclass qrCodeUtil {
  7. publicstaticvoid main(String[] args){
  8. SortedMap<Object,Object> packageParams =newTreeMap<Object,Object>();
  9. //封裝通用引數
  10. ConfigUtil.commonParams(packageParams);
  11. packageParams.put("product_id","20170731");//真實商品ID
  12. packageParams.put
    ("time_stamp",PayCommonUtil.getCurrTime());
  13. //生成簽名
  14. String sign =PayCommonUtil.createSign("UTF-8", packageParams,ConfigUtil.API_KEY);
  15. //組裝二維碼資訊(注意全形和半形:的區別 狗日的騰訊)
  16. StringBuffer qrCode =newStringBuffer();
  17. qrCode.append("weixin://wxpay/bizpayurl?");
  18. qrCode.append("appid="+ConfigUtil.APP_ID);
  19. qrCode
    .append("&mch_id="+ConfigUtil.MCH_ID);
  20. qrCode.append("&nonce_str="+packageParams.get("nonce_str"));
  21. qrCode.append("&product_id=20170731");
  22. qrCode.append("&time_stamp="+packageParams.get("time_stamp"));
  23. qrCode.append("&sign="+sign);
  24. //生成二維碼
  25. ZxingUtils.getQRCodeImge(qrCode.toString(),256,"D:\\weixn.png");
  26. }
  27. }

回撥設定

配置回撥地址

公眾平臺微信支付公眾號支付授權目錄、掃碼支付回撥URL配置入口已於8月1日遷移至商戶平臺(pay.weixin.qq.com)。遷移後,原有配置資料不會受影響,你可在商戶平臺檢視和配置。帶來的不便敬請諒解。

模式一支付.png

回撥方法

簡單說一下,回撥方法中具體的邏輯,如下:

  1. 讀取xml引數
  2. 解析xml成map
  3. 校驗簽名是否正確
  4. 統一下單
  5. 驗證下單是否成功
  6. 通知微信下單成功
  7. 終端使用者授權支付
  8. 當然後面還有一系列的交易邏輯(非此方法)
  1. /**
  2. * 模式一支付回撥URL(生成二維碼見 qrCodeUtil)
  3. * 商戶支付回撥URL設定指引:進入公眾平臺-->微信支付-->開發配置-->掃碼支付-->修改
  4. * @Author 科幫網
  5. * @param request
  6. * @param response
  7. * @throws Exception void
  8. * @Date 2017年8月3日
  9. * 更新日誌
  10. * 2017年8月3日 科幫網 首次建立
  11. *
  12. */
  13. @SuppressWarnings({"unchecked","rawtypes"})
  14. @RequestMapping(value ="bizpayurl")
  15. publicvoid bizpayurl(HttpServletRequest request,HttpServletResponse response)throwsException{
  16. logger.info("模式一支付回撥URL");
  17. //讀取引數
  18. InputStream inputStream = request.getInputStream();
  19. StringBuffer sb =newStringBuffer();
  20. String s;
  21. BufferedReader in =newBufferedReader(newInputStreamReader(inputStream,"UTF-8"));
  22. while((s = in.readLine())!=null){
  23. sb.append(s);
  24. }
  25. in.close();
  26. inputStream.close();
  27. //解析xml成map
  28. Map<String,String> map =XMLUtil.doXMLParse(sb.toString());
  29. //過濾空 設定 TreeMap
  30. SortedMap<Object,Object> packageParams =newTreeMap<Object,Object>();
  31. Iterator it = map.keySet().iterator();
  32. while(it.hasNext()){
  33. String parameter =(String) it.next();
  34. String parameterValue = map.get(parameter);
  35. String v ="";
  36. if(null!= parameterValue){
  37. v = parameterValue.trim();
  38. }
  39. packageParams.put(parameter, v);
  40. }
  41. //判斷簽名是否正確
  42. if(PayCommonUtil.isTenpaySign("UTF-8", packageParams,ConfigUtil.API_KEY)){
  43. //統一下單
  44. SortedMap<Object,Object> params =newTreeMap<Object,Object>();
  45. ConfigUtil.commonParams(params);
  46. //隨即生成一個 入庫 走業務邏輯
  47. String out_trade_no=Long.toString(System.currentTimeMillis());
  48. params.put("body","模式一掃碼支付");// 商品描述
  49. params.put("out_trade_no", out_trade_no);// 商戶訂單號
  50. params.put("total_fee","100");// 總金額
  51. params.put("spbill_create_ip","192.168.1.66");// 發起人IP地址
  52. params.put("notify_url", notify_url);// 回撥地址
  53. params.put("trade_type","NATIVE");// 交易型別
  54. String paramsSign =PayCommonUtil.createSign("UTF-8", params,ConfigUtil.API_KEY);
  55. params.put("sign", paramsSign);// 簽名
  56. String requestXML =PayCommonUtil.getRequestXml(params);
  57. String resXml =HttpUtil.postData(ConfigUtil.UNIFIED_ORDER_URL, requestXML);
  58. 相關推薦

    php支付模式詳解

    最近有個專案要用到微信支付,在此之前沒有研究過這方面,遇到了很多坑,剛剛解決了一些問題,先記錄一下,後期完善後會貼上完整專案。模式一比模式二要複雜一點,就是本地回撥的區別 看了官方的sdk和demo,我還是摸不著頭腦,歸根結底是沒有弄清楚給的邏輯。 下面上官方邏輯圖  

    支付 模式 (JSAPI)

    這個微信支付是靜態二維碼支付,就是店面貼著一個二維碼,讓消費者自己掃自己輸入金額,自己發起支付的支付方式。 要準備的東西比較麻煩: 1、到微信公眾號平臺設定Oauth2的網頁驗證域名(用於獲取code,code用於拿到發起支付的openId),格式是www.

    支付(模式)遇到的那些

    在這個二維碼風起雲湧的時代,線上支付已經成為潮流,沒事掃一掃,打賞一下我也不介意。 醞釀 談坑之前先聊一聊模式一的大體流程,模式一的適用場景一般為自助售賣機或者固定價格的商品的線下交易居多。 當然我能想象到的線上交易,比如,對於固定價格的商品進行支付,由商戶交易

    支付--模式

    官方有關掃碼支付的相關API https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 業務流程說明: (1)商戶後臺系統根據微信支付規定格式生成二維碼(規則見下文),展示給使用者掃碼。 (2)使用者開

    支付模式二開發()

    前言 在涉及到計費的Web專案中,我們往往會用到微信支付,僅根據微信提供的支付介面開發有一定的難度。之前在做微信掃碼支付開發的時候走了很多彎路,而且當時太忙,沒空做開發過程的記錄,在這裡把整個支付的開發總結一下。 微信提供的支付方式:微信支付 關於微信掃碼支

    php支付模式二(圖解 看就懂)

    掃碼支付一直坑了我很久,最近解開了這個迷霧,今天給大家詳細的講解一下 直接上官方給的sdk 有些人可能進去了以後 一個是亂碼,一個是模式二的二維碼無法出現 首先我們要解決一個問題 將 /lib/WxPay.Api.php 函式 postXmlCurl 中的兩行程式

    thinkphp5.0 支付模式

    report apt console hid time() sca jquery namespace bat 僅供個人參考,方便大家。 一、1)https://pay.weixin.qq.com/index.php/core/home/login 復制此地址 打開微信

    thinkphp支付模式

    1.參考本部落格的博文《thinkphp3.2實現微信JSAPI支付》,在此基礎上實現微信掃碼支付只需做簡單修改; 2.只需改WxPayAction裡面pay函式裡面三個地方: 1)將支付型別JSAPI改成NATIVE:$this->setParameter("tr

    支付模式二 開發

    概要 主要記錄自己的開發流程,使用的springMVC 支付流程 引入相關依賴 <!-- 微信支付 --> <dependency> <groupId>com.github.wxpay</grou

    PHP在PC端實現支付模式

    遇到的問題是微信掃碼支付可以成功,但是掃碼成功之後的回撥函式卻怎麼也沒有反應。 吶吶吶,敲黑板,劃重點了,在網上看了好多資料說,PHP的PC端微信掃碼支付模式二這個回撥就是不會響應的!然後,這個回撥函式在連結上是不能跟引數的,並且模式一需要在微信開發者後臺配置

    JAVA支付模式二功能實現以及回撥

    一、準備工作 首先吐槽一下微信關於支付這塊,本身支援的支付模式就好幾種,但是官方文件特別零散,連像樣的Java相關的demo也沒幾個。本人之前沒有搞過微信支付,一開始真是被它搞暈,折騰兩天終於調通了,特此寫下來,以享後人吧! 其中APP_ID和APP_SECRET可以在

    Java支付開發之支付模式

    官方文件 準備工作:已通過微信認證的公眾號, 必須通過ICP備案域名(否則會報支付失敗) 借鑑了很多大神的文章,在此先謝過了 大體過程:先掃碼(還沒有確定實際要支付的金額),這個碼是商品的二維碼,再生成訂單,適用於自動販賣機之類固定金額的。 模式一支付的流程如下圖,稍微有點複雜

    網頁支付模式模式二的適用場景

    模式一和模式二提供了兩種不同的能力,適用於不同的場景,看商戶具體的需求。 兩種模式,在支付的流程中,有一定的共同的流程: 1,生成訂單。 2,使用者支付。 差別在於: 模式一,先掃碼,再生成訂單。 模式二,先生成訂單,再掃碼。 而 生成訂單,代表著 本次支付給商戶的金額是否是已經確定了。 在模式一中,使用者掃

    PHP PC端支付模式二】詳細教程-附帶源(轉)

    idt class pid 方法 按鈕 -c 商戶 開源 玩意兒 博主寫這破玩意兒的時候花了大概快兩天時間才整體的弄懂邏輯,考慮了一下~還是把所有代碼都放出來給大家~抱著開源大無私的精神!誰叫我擅長拍黃片呢?同時也感謝我剛入行時候那些無私幫過我的程序員們! 首先還是

    Java呼叫支付介面(模式二)

    前些天幫朋友實現了一個微信掃碼的介面,在之前也是不會搞這個東西,抱著試試的心態就開始看各種文件和blogs,大多數人都在吐槽微信給的java呼叫微信介面文件太含糊,而且網上的查到的資料也不詳細,只有大概的開發流程沒有太多細節上的講解,最後還是花了一些錢買了一套視

    .NET支付接入(模式二-NATIVE)

    一、前言       經過兩三天的琢磨總算完成了微信掃碼支付功能,不得不感嘆幾句:        .NET版DEMO中的Lib資料夾是關鍵,直接複製到自己的程式碼裡,或者打成dll隨個人意願。 二、正文 Step1:肯定是產生商戶訂單號,然後傳給微信後臺,由微信去組成二維碼字串,然後返給你,你再

    JAVA WEB實現支付模式二)

    一.準備微信掃碼支付要用到的相關引數,這裡將其全部寫入一個配置類,程式碼如下: public class ZbWxPayConfig {     public static String APP_ID = "***********************";     pub

    pc端支付支付寶在線支付(還未驗證 先留著)

    無需 host var efi 成功 raw func pwd 更改 本DEMO演示了PHP支付寶和微信掃碼在線支付,支付成功後,在回調地址顯示支付相關信息。 操作步驟: 1.修改配置文件 Application/common/conf/config.php $arr =

    thinkphp整合系列之支付

    verify ets open exception date ssd 輸出 兼容 input <?phperror_reporting(E_ALL);ini_set(‘display_errors‘, ‘1‘);// 定義時區ini_set(‘date.timezon

    php支付

    b2c blank func blog ransac tro .net -h h5支付 一 概述 掃碼支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用於PC網站支付、實體店單品或訂單支付、媒體廣告支付等場景。前幾天公司需要做了一下