1. 程式人生 > >微信支付之微信小程式支付

微信支付之微信小程式支付

今天給大家介紹一下微信小程式是如果實現支付的流程,在開發之前我們首先要獲取到商戶的appId和mchId最後就是商戶的key值了。這些值在商戶申請成功之後都會通過郵件的形式傳送給商戶,所以如果還沒有拿到這些值的情況下,是不能夠進行微信支付的。

上面的那些值全部拿到之後,我們就可以開始微信支付開發了。

微信支付的流程大致分為四步驟:

1.在小程式中獲取使用者的登入資訊,成功後可以獲取到使用者的code值

2.在使用者自己的服務端請求微信獲取使用者openid介面,成功後可以獲取使用者的openid值   

微信官方api地址:點選開啟連結

3.在使用者自己的伺服器上面請求微信的統一下單介面,下單成功後可以獲取

prepay_id值

微信官方api地址:點選開啟連結

4.在微信小程式中支付訂單,最終實現微信的支付功能

微信官方api地址:點選開啟連結具體的流程圖如下所示:
下面我們就開始詳細的介紹一下微信支付的整個流程:首先是獲取使用者的資訊,也就是小程式中的登入介面:
//app.js
App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        if (res.code) {
          //發起網路請求
          wx.request({
            url: 'https://test.com/onLogin',
            data: {
              code: res.code
            }
          })
        } else {
          console.log('獲取使用者登入態失敗!' + res.errMsg)
        }
      }
    });
  }
})
小程式的官方寫法是這樣的,通過login登入來獲取使用者的code值。因為這個code值,在請求使用者的openid需要用到。獲取到使用者code值之後,就需要我們服務端來請求微信的這個地址:https://api.weixin.qq.com/sns/jscode2session服務端程式碼如下:
    public Map<String,Object> onLogin(String code){
        Map<String,Object>result=new HashMap<>();
        String url=ConstantUtils.getSessionKeyUrl+"?appid="+ ConstantUtils.appId+
                "&secret="+ConstantUtils.secret+"&js_code="+code+"&grant_type="+ConstantUtils.grantType;
        JSONObject httpResult=HttpUtils.httpGet(url);
        result.put("openid",httpResult.get("openid"));
        result.put("session_key",httpResult.get("session_key"));
        result.put("expires_in",httpResult.get("expires_in"));
        return  result;
    }
具體的介面介紹這裡就不做過多的介紹,因為微信官方api裡面寫的很清楚了。請求這個介面之後我們就可以獲取到使用者的openid了,這個引數是在接下來統一下訂單的介面需要用到的。最後就是統一下單的介面,這個介面主要是為了獲取支付介面所需要的prepay_id欄位值。統一下訂單介面是發生在我們自己的服務端這邊的,我們需要請求微信的:https://api.mch.weixin.qq.com/pay/unifiedorder介面。這個介面有很多注意點,特別是sign簽名的生成規則,我在初期好多次都是因為sign簽名驗證失敗導致最後下單失敗的。還有一點就是total_fee總金額是以分為單位,而且只能是整數,不能是分數。下面看我服務端的程式碼:
 public Map<String,Object> createOrder(String openId){
        Map<String,Object>result=new HashMap<>();
        result.put("status","1");
        result.put("payType","weixin");
        result.put("orderId","12345678");
        String formData=orderService.commitData(openId);
        String httpResult = HttpUtils.httpXMLPost(ConstantUtils.createOrderUrl,formData);
        try {
            Map<String, String> resultMap = WXPayUtil.xmlToMap(httpResult);
            result.put("package", "prepay_id=" + resultMap.get("prepay_id"));
            result.put("nonceStr",resultMap.get("nonce_str"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String times= WXPayUtil.getCurrentTimestamp()+"";
        result.put("timeStamp",times);
        Map<String, String> packageParams = new HashMap<String ,String>();
        packageParams.put("appId", ConstantUtils.appId);
        packageParams.put("signType", ConstantUtils.signType);
        packageParams.put("nonceStr",result.get("nonceStr")+"");
        packageParams.put("timeStamp",times);
        packageParams.put("package", result.get("package")+"");//商戶訂單號
        String sign="";
        try {
            sign= WXPayUtil.generateSignature(packageParams, ConstantUtils.key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        result.put("paySign",sign);
        return result;
    }
上面用到的WXPayUtil工具類是微信官方支demo中的工具類,裡面函式很齊全,大家可以去官網上下載。請求xml生成函式程式碼如下:
 public String commitData(String openId){
        String nonceStr= WXPayUtil.generateUUID();
        String body="JSAPI支付測試";
        Map<String, String> packageParams = new HashMap<String ,String>();
        packageParams.put("appid", ConstantUtils.appId);
        packageParams.put("body",body);
        packageParams.put("mch_id", ConstantUtils.mchId);
        packageParams.put("nonce_str",nonceStr);
        packageParams.put("notify_url", ConstantUtils.notifyUrl);//支付成功後的回撥地址
        packageParams.put("openid",openId+"");//支付方式
        packageParams.put("out_trade_no", "12345678");//商戶訂單號
        packageParams.put("sign_type", ConstantUtils.signType);
        packageParams.put("spbill_create_ip","127.0.0.1");
        packageParams.put("total_fee", "1");//支付金額,這邊需要轉成字串型別,否則後面的簽名會失敗
        packageParams.put("trade_type", ConstantUtils.tradeType);//支付方式
        String sign="";
        try {
            sign= WXPayUtil.generateSignature(packageParams, ConstantUtils.key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String formData = "<xml>";
        formData += "<appid>"+ ConstantUtils.appId+"</appid>"; //appid
        formData += "<body>" + body+ "</body>";
        formData += "<mch_id>"+ ConstantUtils.mchId+"</mch_id>"; //商戶號
        formData += "<nonce_str>"+nonceStr+"</nonce_str>";
        formData += "<notify_url>"+ ConstantUtils.notifyUrl+"</notify_url>";
        formData += "<openid>"+openId+"</openid>";
        formData += "<out_trade_no>" + "12345678" + "</out_trade_no>";
        formData += "<sign_type>"+ ConstantUtils.signType+"</sign_type>";
        formData += "<spbill_create_ip>"+"127.0.0.1"+"</spbill_create_ip>";
        formData += "<total_fee>" + "1" + "</total_fee>";
        formData += "<trade_type>"+ ConstantUtils.tradeType+"</trade_type>";
        formData += "<sign>"+sign+"</sign>";
        formData += "</xml>";
        return formData;
    }
sign簽名的拼接規則工具類都給我們實現好了,我們直接呼叫就可以了。最後也是最關鍵的一步就是小程式裡面的微信支付過程了,官方支付的程式碼是:
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){},
'fail':function(res){},
'complete':function(res){}
})
關於欄位的解釋大家可以去官網上面看看,裡面說的特別詳細,地址就在上面給出的。


最後支付還是需要我們真實用手機付錢才可以,支付的最小單位可以是1分錢,測試的時候我們支付一分錢就可以了。這樣微信小程式支付的整個過程就好了,大致的流程就是上面說的這樣。當然細節還有很多需要注意的地方,不是一篇文章可以概括的,這篇文章對於有過服務號支付的人來說比較好理解,如果沒有過這樣的經驗看起來還是有點迷糊的。我當時剛接觸的時候也研究了好久。所以我打算專門為這個小程式支付做一個講解視訊,視訊地址我會放在我的公眾號裡面或者百度雲盤上面(專案程式碼也會放在上面哦)。視訊教程已經制作好了,雖然有點囉嗦,但都是滿滿的乾貨,還有就是開發過程中一路遇到的各種坑。如果大家對文章有什麼問題或者疑意之類的,可以加我訂閱號在上面留言,訂閱號上面我會定期更新最新部落格。如果嫌麻煩可以直接加我wechat:lzqcode

相關推薦

JAVA程式支付退款(PKCS12證書設定與SSL請求封裝)

問題背景 話說有小程式支付就有小程式退款,退款和支付是對應的,不能憑空退。 解決方案 解決方案有點長,我們分兩個部分,一個是業務引數拼接與Sign簽名,一個是https請求/ssl請求與pkcs12證書,用到的包org.apache.httpcomponents/httpcl

支付程式支付

今天給大家介紹一下微信小程式是如果實現支付的流程,在開發之前我們首先要獲取到商戶的appId和mchId最後就是商戶的key值了。這些值在商戶申請成功之後都會通過郵件的形式傳送給商戶,所以如果還沒有拿到這些值的情況下,是不能夠進行微信支付的。上面的那些值全部拿到之後,我們就可

程式 支付

var app = getApp(); Page({ data: {}, onLoad: function (options) { // 頁面初始化 options為頁面跳轉所帶來的引數 var that = this //登陸獲取code wx.

程式支付流程

使用者在微信端使用小程式,發起微信支付;(使用者) 小程式呼叫微信api(wx.login()),獲取到使用者登入憑證code(五分鐘內有效),小程式將code、需要支付的商品資訊等一起傳送給自己的商戶系統後臺;(小程式端) a、商戶系統後臺獲取到小程式傳遞過來

php程式支付

<?php class WxpayModel { //介面API URL字首     const API_URL_PREFIX = 'https://api.mch.weixin.qq.com'; //下單地址URL     const UN

程式支付全問題解決

這幾天在做小程式的支付,沒有用官方的SDK,這裡就純用官方的文件搞一發。 * 注作者使用的PHP,不過支付流程都是這樣 開發前必讀 主要流程 小程式前端傳送求參請求 接受請求封裝 “統一下單” 獲取package 小程式接受 “統一下單” 獲取的package值帶入wx.reque

程式支付統一下單介面

微信小程式——支付 1.通過code獲取openId code:使用者登入憑證(有效期五分鐘)。開發者需要在開發者伺服器後臺呼叫 api,使用 code 換取 openid 和 session_key 等資訊 openid: 使用者唯一標識 session_key: 會

程式支付(thinkphp)

之前一直想學下微信支付,這次終於有機會來操作一下,還是記錄下來,跟大家分享分享。 一、首先,我們要在微信官方網站上去下載支付介面,然後改個名方便呼叫(例如:WeiXinpay),然後將下載的檔案放入thinkphp的Vendor檔案下面; 二、然後去官網下載商戶操作證書:https://pa

說說程式支付

最近有機會嘗試了小程式的支付開發,總結下期間碰到的問題。   小程式支付和以往的網頁、APP微信支付大同小異,應該說小程式的支付更簡便了些,不需要設定支付目錄、不需要授權域名等操作。其實主要的流程就兩步: 開發者服務端向微信發起統一下單請求,小程式調起微信支付。 接下來

程式支付證書及SSL證書使用

小程式使用微信支付包括:電腦管理控制檯匯入證書->修改程式碼為搜尋證書->授權IIS使用證書->設定TSL加密級別為1.2 描述: 1、通常呼叫微信生成訂單介面的時候,使用的證書都是直接路徑指向就行了,但是這種方法在IIS是不適用的 2、IIS網站繫結SSL證書之後,證書加密級別預設為

程式支付和退款

微信小程式支付的主要邏輯集中在後端,前端只需攜帶支付所需的資料請求後端介面然後根據返回結果做相應成功失敗處理即可。 本篇文章後端使用的是php,側重於整個支付的流程和一些細節方面的東西。所以使用其他後端語言的朋友有需要也是可以看一下的。 很多時候開發的需求和相應問題的解決

程式暫停“虛擬支付”,知識付費程式可以這麼玩!

5月8日起小程式關閉虛擬支付,對於此次小程式關閉虛擬支付影響最大的,應該是知識付費/線上教育類的小程式,這類小程式現有的變現模式將受到巨大的衝擊。   一、這次整改意味著什麼?有3個需要注意   1、虛擬支付 不是所有提供支付功能的小程式都要被整改,僅僅只有涉及“虛擬支付

程式支付流程,非同步回撥及訊息模板呼叫(php原始碼)

首先還是老樣子把流程圖給大家發一下 商戶系統和微信支付系統主要互動: 1、小程式內呼叫登入介面,獲取到使用者的openid,api參見公共api【小程式登入API】 2、商戶server呼叫支付統一下單,api參見公共api【統一下單API】 3、商戶server呼叫再次簽

java服務端程式支付demo

一丶項目錄結構 demo下載地址 小程式支付demo下載 二丶實現步驟 1.在小程式中獲取使用者的登入資訊,成功後可以獲取到使用者的程式碼值 2.在使用者自己的服務端請求微信獲取使用者的OpenID介面,成功後可以電子雜誌使用者的OpenID的值 微信

程式支付以及退款開發

最近公司專案急著測試,需要開發微信小程式+微信支付+微信退款,本著這幾天的一些研究,決定記錄一下開發的過程。 本著知識分享的原則,希望對大家有所幫助。 本篇針對的是微信小程式的支付開發,如果有對微信公眾號的支付開發需要的,可以去我的github上看看,有個sell的專案很好的完成了公眾號方面的支付與退款,程式

服務端程式支付/退款詳解

賬號支援:小程式appid,小程式secret,商戶號mchid,商戶secret 服務端和微信支付系統主要互動: 1、小程式內呼叫登入介面,獲取到使用者的openid,api參見公共api【小程式登入API】 前端呼叫介面wx.login() 獲取臨時登入憑

程式支付功能,完成整個交易的思路和程式碼

開發工具:微信開發者工具,Intellij idea 2018 框架:spring boot  交易流程圖: 下面直接上程式碼: 1.在wxml新增一個支付按鈕,點選監聽payMethod方法 <view><button bindtap='pa

程式支付完整示例

本文例項為大家分享了php實現小程式支付的具體程式碼,供大家參考,具體內容如下 環境: tp3.2  + 小程式 微信支付功能開通 Step1:  下載PHP 支付SDK(下載地址:https://pay.weixin.qq.com/wiki/doc/api/j

程式支付(PHP後臺)“支付統一下單“介面的坑

按照微信的文件來看確實流程是什麼樣的,但某些資料卻神一般的缺少說明,硬生生調了一天才知道完整的使用資料。 小程式提交訂單後就需要後臺請求兩次API,一次為獲取openid(某文件說是在小程式內獲取不安全,所以丟給後臺來獲取),後面一次為獲取prepay_id。最後那

Python實現程式支付功能

由於最近自己在做小程式的支付,就在這裡簡單介紹一下講一下用python做小程式支付這個流程。當然在進行開發之前還是建議讀一下具體的流程,清楚支付的過程。 1.支付互動流程  2.獲取openid(微信使用者標識) 1 import requests 2 3 from config import