1. 程式人生 > >支付寶APP支付完成後臺回撥示例-java

支付寶APP支付完成後臺回撥示例-java

支付寶在APP支付完成後,需要支付寶主動呼叫notify_url進行業務的處理。當支付寶通知失敗後,會不斷的發起通知,知道通知成功,這樣保證了業務的正常執行。程式碼如下(後臺回撥程式碼):

1、下載支付寶的sdk。(在我的資源中有上傳)

2、實現程式碼(共6個類):AlipayConfig(配置類)、AlipayController(介面類)、AlipayCore、AlipayNotify、Base64、RSA後四個類都為支付寶自帶的實現類。

package com.alice.app.controller.notify.alipay;


/* *
 *類名:AlipayConfig
 *功能:基礎配置類
 *詳細:設定帳戶有關資訊及返回路徑
 *版本:3.3
 *日期:2012-08-10
 *說明:
 */


public class AlipayConfig {
// 合作身份者ID,簽約賬號,以2088開頭由16位純數字組成的字串,檢視地址:https://b.alipay.com/order/pidAndKey.htm
public static String partner = "xxxxxxxxxxxxxxxx";

//商戶的私鑰,需要PKCS8格式,RSA公私鑰生成:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
public static String private_key = "xxxxxxx";
//沙箱環境
//public static String private_key="xxxxxxxxx" ;

// 收款支付寶賬號,以2088開頭由16位純數字組成的字串,一般情況下收款賬號就是簽約賬號
public static String seller_id = "xxxxxxxxxxxxx" ;

// 支付寶的公鑰,檢視地址:https://b.alipay.com/order/pidAndKey.htm
public static String alipay_public_key  = "xxxxxxxxxxxxxxxx";

// 除錯用,建立TXT日誌資料夾路徑
public static String log_path = "D:\\";

// 字元編碼格式 目前支援 gbk 或 utf-8
public static String input_charset = "utf-8";

// 簽名方式 不需修改
public static String sign_type = "RSA";

// 支付型別 ,無需修改
public static String payment_type = "1";

// 呼叫的介面名,無需修改
public static String service = "create_direct_pay_by_user";

public static String notify_url = "http://xxxxxxxx/xxxxxxx/notify/payNotify" ;
}

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import javax.servlet.http.HttpServletRequest;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
@RequestMapping("/notify")
public class AlipayController {
@RequestMapping(value = { "/getPayNotify" }, method = { RequestMethod.POST })
@ResponseBody
public String getPayNotify(HttpServletRequest request) throws Exception {
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();

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] + ",";
}
//亂碼解決,這段程式碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段程式碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}

//獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以下僅供參考)//
//商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

//支付寶交易號
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");


//交易狀態
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

//非同步通知ID
String notify_id=request.getParameter("notify_id");

//sign
String sign=request.getParameter("sign");

if(notify_id!=""&&notify_id!=null){
if(AlipayNotify.verifyResponse(notify_id).equals("true"))//判斷成功之後使用getResponse方法判斷是否是支付寶發來的非同步通知。
{
if(AlipayNotify.getSignVeryfy(params, sign))//使用支付寶公鑰驗籤
{
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
//業務處理
}

return "success" ;
}
else//驗證簽名失敗
{
return "sign fail" ;
}
}
else//驗證是否來自支付寶的通知失敗
{
return "response fail" ;
}
}
else{
return "no notify message" ;
}
 }
}


import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AlipayCore {
    /** 
     * 除去陣列中的空值和簽名引數
     * @param sArray 簽名引數組
     * @return 去掉空值與簽名引數後的新簽名引數組
     */
    public static Map<String, String> paraFilter(Map<String, String> sArray) {


        Map<String, String> result = new HashMap<String, String>();


        if (sArray == null || sArray.size() <= 0) {
            return result;
        }


        for (String key : sArray.keySet()) {
            String value = sArray.get(key);
            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                || key.equalsIgnoreCase("sign_type")) {
                continue;
            }
            result.put(key, value);
        }


        return result;
    }


    /** 
     * 把陣列所有元素,並按照“引數=引數值”的模式用“&”字元拼接成字串
     * @param params 需要參與字元拼接的引數組
     * @param sorts   是否需要排序 true 或者 false
     * @return 拼接後字串
     */
    public static String createLinkString(Map<String, String> params) {


        List<String> keys = new ArrayList<String>(params.keySet());


        Collections.sort(keys);


        
        String prestr = "";


        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);


            if (i == keys.size() - 1) {//拼接時,不包括最後一個&字元
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }


        return prestr;
    }


    /** 
     * 寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫)
     * @param sWord 要寫入日誌裡的文字內容
     */
    public static void logResult(String sWord,String filename) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(AlipayConfig.log_path + "alipay_log_" + System.currentTimeMillis()+filename+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

public class AlipayNotify {


    /**
     * 支付寶訊息驗證地址
     */
    private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";


    /**
     * 根據反饋回來的資訊,生成簽名結果
     * @param Params 通知返回來的引數陣列
     * @param sign 比對的簽名結果
     * @return 生成的簽名結果
     */
public static boolean getSignVeryfy(Map<String, String> Params, String sign) {
    //過濾空值、sign與sign_type引數
    Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
        //獲取待簽名字串
        String preSignStr = AlipayCore.createLinkString(sParaNew);
        //獲得簽名驗證結果
        boolean isSign = false;
        if(AlipayConfig.sign_type.equals("RSA")){
        isSign = RSA.verify(preSignStr, sign, AlipayConfig.alipay_public_key, AlipayConfig.input_charset);
        }
        return isSign;
    }


    /**
    * 獲取遠端伺服器ATN結果,驗證返回URL
    * @param notify_id 通知校驗ID
    * @return 伺服器ATN結果
    * 驗證結果集:
    * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空 
    * true 返回正確資訊
    * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘
    */
    public static String verifyResponse(String notify_id) {
        //獲取遠端伺服器ATN結果,驗證是否是支付寶伺服器發來的請求


        String partner = AlipayConfig.partner;
        String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;


        return checkUrl(veryfy_url);
    }


    /**
    * 獲取遠端伺服器ATN結果
    * @param urlvalue 指定URL路徑地址
    * @return 伺服器ATN結果
    * 驗證結果集:
    * invalid命令引數不對 出現這個錯誤,請檢測返回處理中partner和key是否為空 
    * true 返回正確資訊
    * false 請檢查防火牆或者是伺服器阻止埠問題以及驗證時間是否超過一分鐘
    */
    public static String checkUrl(String urlvalue) {
        String inputLine = "";


        try {
            URL url = new URL(urlvalue);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
                .getInputStream()));
            inputLine = in.readLine().toString();
        } catch (Exception e) {
            e.printStackTrace();
            inputLine = "";
        }


        return inputLine;
    }
}


public final class Base64 {


    static private final int     BASELENGTH           = 128;
    static private final int     LOOKUPLENGTH         = 64;
    static private final int     TWENTYFOURBITGROUP   = 24;
    static private final int     EIGHTBIT             = 8;
    static private final int     SIXTEENBIT           = 16;
    static private final int     FOURBYTE             = 4;
    static private final int     SIGN                 = -128;
    static private final char    PAD                  = '=';
    static private final boolean fDebug               = false;
    static final private byte[]  base64Alphabet       = new byte[BASELENGTH];
    static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];


    static {
        for (int i = 0; i < BASELENGTH; ++i) {
            base64Alphabet[i] = -1;
        }
        for (int i = 'Z'; i >= 'A'; i--) {
            base64Alphabet[i] = (byte) (i - 'A');
        }
        for (int i = 'z'; i >= 'a'; i--) {
            base64Alphabet[i] = (byte) (i - 'a' + 26);
        }


        for (int i = '9'; i >= '0'; i--) {
            base64Alphabet[i] = (byte) (i - '0' + 52);
        }


        base64Alphabet['+'] = 62;
        base64Alphabet['/'] = 63;


        for (int i = 0; i <= 25; i++) {
            lookUpBase64Alphabet[i] = (char) ('A' + i);
        }


        for (int i = 26, j = 0; i <= 51; i++, j++) {
            lookUpBase64Alphabet[i] = (char) ('a' + j);
        }


        for (int i = 52, j = 0; i <= 61; i++, j++) {
            lookUpBase64Alphabet[i] = (char) ('0' + j);
        }
        lookUpBase64Alphabet[62] = (char) '+';
        lookUpBase64Alphabet[63] = (char) '/';


    }


    private static boolean isWhiteSpace(char octect) {
        return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
    }


    private static boolean isPad(char octect) {
        return (octect == PAD);
    }


    private static boolean isData(char octect) {
        return (octect < BASELENGTH && base64Alphabet[octect] != -1);
    }


    /**
     * Encodes hex octects into Base64
     *
     * @param binaryData Array containing binaryData
     * @return Encoded Base64 array
     */
    public static String encode(byte[] binaryData) {


        if (binaryData == null) {
            return null;
        }


        int lengthDataBits = binaryData.length * EIGHTBIT;
        if (lengthDataBits == 0) {
            return "";
        }


        int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
        int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
        int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
        char encodedData[] = null;


        encodedData = new char[numberQuartet * 4];


        byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;


        int encodedIndex = 0;
        int dataIndex = 0;
        if (fDebug) {
            System.out.println("number of triplets = " + numberTriplets);
        }


        for (int i = 0; i < numberTriplets; i++) {
            b1 = binaryData[dataIndex++];
            b2 = binaryData[dataIndex++];
            b3 = binaryData[dataIndex++];


            if (fDebug) {
                System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
            }


            l = (byte) (b2 & 0x0f);
            k = (byte) (b1 & 0x03);


            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
            byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);


            if (fDebug) {
                System.out.println("val2 = " + val2);
                System.out.println("k4   = " + (k << 4));
                System.out.println("vak  = " + (val2 | (k << 4)));
            }


            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
        }


        // form integral number of 6-bit groups
        if (fewerThan24bits == EIGHTBIT) {
            b1 = binaryData[dataIndex];
            k = (byte) (b1 & 0x03);
            if (fDebug) {
                System.out.println("b1=" + b1);
                System.out.println("b1<<2 = " + (b1 >> 2));
            }
            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
            encodedData[encodedIndex++] = PAD;
            encodedData[encodedIndex++] = PAD;
        } else if (fewerThan24bits == SIXTEENBIT) {
            b1 = binaryData[dataIndex];
            b2 = binaryData[dataIndex + 1];
            l = (byte) (b2 & 0x0f);
            k = (byte) (b1 & 0x03);


            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);


            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
            encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
            encodedData[encodedIndex++] = PAD;
        }


        return new String(encodedData);
    }


    /**
     * Decodes Base64 data into octects
     *
     * @param encoded string containing Base64 data
     * @return Array containind decoded data.
     */
    public static byte[] decode(String encoded) {


        if (encoded == null) {
            return null;
        }


        char[] base64Data = encoded.toCharArray();
        // remove white spaces
        int len = removeWhiteSpace(base64Data);


        if (len % FOURBYTE != 0) {
            return null;//should be divisible by four
        }


        int numberQuadruple = (len / FOURBYTE);


        if (numberQuadruple == 0) {
            return new byte[0];
        }


        byte decodedData[] = null;
        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
        char d1 = 0, d2 = 0, d3 = 0, d4 = 0;


        int i = 0;
        int encodedIndex = 0;
        int dataIndex = 0;
        decodedData = new byte[(numberQuadruple) * 3];


        for (; i < numberQuadruple - 1; i++) {


            if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
                || !isData((d3 = base64Data[dataIndex++]))
                || !isData((d4 = base64Data[dataIndex++]))) {
                return null;
            }//if found "no data" just return null


            b1 = base64Alphabet[d1];
            b2 = base64Alphabet[d2];
            b3 = base64Alphabet[d3];
            b4 = base64Alphabet[d4];


            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
        }


        if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
            return null;//if found "no data" just return null
        }


        b1 = base64Alphabet[d1];
        b2 = base64Alphabet[d2];


        d3 = base64Data[dataIndex++];
        d4 = base64Data[dataIndex++];
        if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
            if (isPad(d3) && isPad(d4)) {
                if ((b2 & 0xf) != 0)//last 4 bits should be zero
                {
                    return null;
                }
                byte[] tmp = new byte[i * 3 + 1];
                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
                tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
                return tmp;
            } else if (!isPad(d3) && isPad(d4)) {
                b3 = base64Alphabet[d3];
                if ((b3 & 0x3) != 0)//last 2 bits should be zero
                {
                    return null;
                }
                byte[] tmp = new byte[i * 3 + 2];
                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
                tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
                tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
                return tmp;
            } else {
                return null;
            }
        } else { //No PAD e.g 3cQl
            b3 = base64Alphabet[d3];
            b4 = base64Alphabet[d4];
            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);


        }


        return decodedData;
    }


    /**
     * remove WhiteSpace from MIME containing encoded Base64 data.
     *
     * @param data  the byte array of base64 data (with WS)
     * @return      the new length
     */
    private static int removeWhiteSpace(char[] data) {
        if (data == null) {
            return 0;
        }


        // count characters that's not whitespace
        int newSize = 0;
        int len = data.length;
        for (int i = 0; i < len; i++) {
            if (!isWhiteSpace(data[i])) {
                data[newSize++] = data[i];
            }
        }
        return newSize;
    }
}



import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;


public class RSA{

public static final String  SIGN_ALGORITHMS = "SHA1WithRSA";

/**
* RSA簽名
* @param content 待簽名資料
* @param privateKey 商戶私鑰
* @param input_charset 編碼格式
* @return 簽名值
*/
public static String sign(String content, String privateKey, String input_charset)
{
        try 
        {
        PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) ); 
        KeyFactory keyf = KeyFactory.getInstance("RSA");
        PrivateKey priKey = keyf.generatePrivate(priPKCS8);


            java.security.Signature signature = java.security.Signature
                .getInstance(SIGN_ALGORITHMS);


            signature.initSign(priKey);
            signature.update( content.getBytes(input_charset) );


            byte[] signed = signature.sign();
            
            return Base64.encode(signed);
        }
        catch (Exception e) 
        {
        e.printStackTrace();
        }
        
        return null;
    }

/**
* RSA驗簽名檢查
* @param content 待簽名資料
* @param sign 簽名值
* @param alipay_public_key 支付寶公鑰
* @param input_charset 編碼格式
* @return 布林值
*/
public static boolean verify(String content, String sign, String alipay_public_key, String input_charset)
{
try 
{
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
       byte[] encodedKey = Base64.decode(alipay_public_key);
       PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));



java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);

signature.initVerify(pubKey);
signature.update( content.getBytes(input_charset) );

boolean bverify = signature.verify( Base64.decode(sign) );
return bverify;


catch (Exception e) 
{
e.printStackTrace();
}

return false;
}
}

相關推薦

支付APP支付完成後臺示例-java

支付寶在APP支付完成後,需要支付寶主動呼叫notify_url進行業務的處理。當支付寶通知失敗後,會不斷的發起通知,知道通知成功,這樣保證了業務的正常執行。程式碼如下(後臺回撥程式碼): 1、下載支付寶的sdk。(在我的資源中有上傳) 2、實現程式碼(共6個類):Alip

PHP服務端整合支付APP支付以及

說到支付寶APP支付,相對於微信APP支付要簡單一點,下篇會具體說微信APP支付的具體接入; 流程:客戶端提供資料 ->  服務端處理生成支付引數返回給客戶端調起支付  ->  支付成功  ->  支付寶回撥結果  ->  接受回撥修改訂單狀態 首先

支付app支付java後臺流程及原理分析

system 分析 req eterm 格式 prop 通過 false 由於 java版支付寶app支付流程及原理分析   本實例是基於springmvc框架編寫 一、流程步驟 1.執行流程 當手機端app(就是你公司開發的a

支付APP支付裏設置應用網關和授權調地址是不必填的

read 1-1 mage tid app blog cnblogs opencl ref 支付寶APP支付裏設置應用網關和授權回調地址位置為: 支付寶app支付應用網關和授權回調地址為非必填,詳細解釋鏈接:https://openclub.alipay.com/read.

android 集成支付app支付(原生態)-包括android前端與java後臺

請求 call 修改 quest ali log gif 操作 asm 本文講解了 android開發的原生態app集成了支付寶支付, 還提供了java後臺服務器處理支付寶支付的加密代碼, app前端與java後臺服務器使用json數據格式交互信息,java後臺服務主要用來

支付APP支付-php後臺生成請求引數

支付寶APP支付 本文將介紹新版支付寶app支付的php後臺(php框架是tp5): 下載官方文件 配置商家支付寶商家引數 構造業務請求引數 *配置公共引數 生成簽名 生成最終的請求字串 生成最終的請求字串 下載官方文件 配置商家支付

支付app支付java後臺流程demo

使用ssm框架實現支付寶支付功能。 支付寶測試環境程式碼測試 原始碼 https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay 1.下載電腦網站的官方demo: 下載:https://docs.open.alip

.Net後臺實現支付APP支付

void 支付平臺 固定 ces rand threading ade 簽名 ask 前面討論了微信支付,接下來聊聊支付寶的APP支付(新款支付寶支付)。其實這些支付原理都一樣,只不過具體到每個支付平臺,所使用的支付配置參數不同,返回至支付端的下單參數也不同。 話不多說,直

支付 app支付 沙盤使用

gin 所有 必須 com watermark pda 權限 enter htm 文檔說明 沙箱測試: App支付沙箱接入註意點 1、app支付支持沙箱接入;在沙箱調通接口後,必須在線上進行測試與驗收,所有返回碼及業務邏輯以線上為準;2、app支付只支持余額支付,

H5集成支付App支付客戶端+服務端(java

XML 服務端 onf response 成功 code default format sim 由於最近項目需要接入第三方開發,支付寶支付,微信支付,OSS圖片上傳以及短信服務。為避免第一次開發支付寶再次花時間查看文檔,今天總結一下接入支付寶的過程,以及接入過程中遇到的問題

支付 APP支付 錯誤碼

需要 app 返回 ron str 一個 行處理 appid 分號 出現_38173_這個錯誤碼的原因是服務器返回給前端的字符串中 有一個map; 三個字母一個分號 需要在前端用戶字符串處理函數進行處理後 在進行後續操作 出現_10146_這個錯誤嗎的原因 1.你的APPI

支付APP支付整合+.net(沙箱除錯)

1.服務端整合程式碼 private const string APPID = "發起請求的應用ID"; private const string APP_PRIVATE_KEY = "私鑰"; private const string ALIPAY

支付APP支付——支付流程說明及示例

轉自:https://blog.csdn.net/flygoa/article/details/54891473   支付寶APP支付——支付流程說明及示例 官方示例圖 螞蟻金服開放平臺文件:地址 官方流程圖:地址 如圖,以Android平臺為例: 第4步:呼叫支付介

支付APP支付 統一下單 php服務端 tp5

/*支付寶第三方支付 * *生成APP支付訂單資訊 * @param number  uid 使用者id * @param string   token 使用者token * @param number  oid

PHP 支付APP支付 (TP5)

PHP交流群:294088839 1.進行支付請求 require_once './payment/zfb/pagepay/service/AlipayTradeService.php'; require_once './payment/zfb/pagepay/buildermodel/

支付APP支付

一、基礎說明 現在開發一個電商APP,最少不了的就是支付,目前最常見的支付有微信支付和支付寶支付,先來介紹支付寶APP支付,其實支付寶的文件說明已經很清楚了,裡面有很多demo,你還可以通過沙箱環境去除錯支付。螞蟻金服開放平臺地址:https://open.alipay.com/developmentAcc

關於tp5使用微信支付app支付、掃碼支付

<?php /** * Created by PhpStorm. * User: ljy * Date: 17/10/14 * Time: 下午3:33 */ namespace app\api\controller; use Pingpp\Pingpp; use Pingpp\Charge

支付APP支付申請配置過程詳解

第一步:你需要申請一個支付寶商家賬戶賬號,登陸之後進入產品中心,進行APP支付產品接入,填寫相關資料,等待稽核。 第二步:進行APP支付申請資訊完善 第三步:進入螞蟻金服開放平臺進行開發者認證。 第四步:認證成為開發者之後,登陸進入平臺,然後再開發者中心進入網頁&移動應用列表。

PHP支付APP支付介面

1-1:首先下載支付寶官方SDK,我的是PHP版的,起名“alipay” 1-2:配置檔案 config.php // 支付寶 'ALIPAY_CONFIG' =>[ 'app_id' =>'12345678', /

用PHP SDK做支付APP支付(下單及驗籤)

一、如下為支付寶APP支付PHP SDK DEMO地址。 二、如下為支付寶APP支 說明:此處用CI框架,若正式上線需將引數$aop->appId、$aop->rsaPrivate