目录

1.爱贝支付流程

2.接口说明

2.1下单-获取transid

2.2返回参数及格式

3.代码实现

3.1项目结构

3.2OrderMain

3.3OrderTest

3.4RSA

3.5Base64

3.6HttpUtils

3.7IpayConfig

3.8GetData


爱贝支付是之前公司用的,一款集微信,支付宝,银联的第三方支付工具。做个笔记复习一下

1.爱贝支付流程

2.接口说明

接口均采用http协议,POST方法。

数据传输的时候参数值需要进行urlencode,urlencode规则使用application/x-www-form-urlencoded方式,即空格” ”会被编码成加号”+”。进行urlencode编码时,中文字符采用UTF-8编码。

请求和应答参数均为transdata、sign、signtype。transdata为具体业务参数,数据格式为json格式;sign为transdata的签名数据;signtype为签名算法类型,目前只支持RSA算法。具体呈现方式为transdata=xxxx&sign=yyyy&signtype=RSA,其中yyyy就是对xxxx的签名数据,yyyy=rsa(md5(xxxx))。采用RSA MD5数字签名算法,私钥签名、公钥验签。和Java里面的MD5WithRSA算法一致。

商户需要以应用私钥对请求数据进行签名、使用平台公钥对应答数据进行验签。错误应答无须验签。

2.1.下单-获取transid

请求URL:https://cp.iapppay.com/payapi/order

请求格式示例:https://cp.iapppay.com/payapi/order?transdata=urlencode(xxx)&sign=urlencode(yyy)&signtype=RSA

urlencode前内容:https://cp.iapppay.com/payapi/order?transdata={"appid":"123","waresid":1,"cporderid":"22222","price":1.00,"currency":"RMB","appuserid":"test","notifyurl":"http://www.iapppay.com/test"}&sign=xxxxxx&signtype=RSA

2.2返回参数及格式

成功应答数据样例(urlencode前内容):transdata={"transid":"11111"}&sign=xxxxxx&signtype=RSA

成功应答参数说明:

失败应答数据样例(urlencode前内容):transdata={"code":"1001","errmsg":"签名验证失败"}

失败应答参数列表:

3.代码实现

3.1项目结构

3.2OrderMain

package Test;import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;import util.HttpUtils;
import util.IpayConfig;
import util.RSA;
import net.sf.json.JSONObject;public class OrderMain {/*** 1.封装下单请求数据* @param appid * @param waresid 商品编号* @param waresname 商品名称* @param cporderid 商户订单号* @param price 支付金额-可选* @param appuserid 唯一标识-1#23* @param cpprivateinfo 商户私有信息-可选* @param notifyurl 支付结果通知地址-可选* @return*/public static String ReqData(String appid, int waresid,String waresname,String cporderid ,float price,String appuserid,String cpprivateinfo,String notifyurl) {JSONObject jsonObject = new JSONObject();jsonObject.put("appid", appid);//商品编号jsonObject.put("waresid", waresid);//商户订单号jsonObject.put("cporderid", cporderid);//货币类型-RMBjsonObject.put("currency", "RMB");//唯一标识-1#23jsonObject.put("appuserid", appuserid);//商品名称-可选if(!waresname.isEmpty()){jsonObject.put("waresname", waresname);}//支付金额-可选jsonObject.put("price", price);//商户私有信息-可选if(!cpprivateinfo.isEmpty()){jsonObject.put("cpprivateinfo", cpprivateinfo);}//支付结果通知地址-可选if(!notifyurl.isEmpty()){jsonObject.put("notifyurl", notifyurl);}//1.请求参数String transdata = jsonObject.toString();// 组装成 json格式数据//2.sign签名数据String sign = RSA.sign(transdata, IpayConfig.PRIVATE_KEY, "utf-8");//3.url//String url = "https://cp.iapppay.com/payapi/order?";//post数据String data = "transdata=" + transdata + "&sign=" + sign+ "&signtype=RSA";// 组装请求参数       //System.out.println("下单数据:"+data);System.out.println("1.post数据:"+data);return data;}/*** 2.请求过程,返回流水单号* @param reqData* @return*/public static String GetTransid(String reqData){
//      System.out.println(reqData);String url = "https://cp.iapppay.com/payapi/order";//调用Http的post方法,发送请求数据String respData = HttpUtils.sentPost(url, reqData);System.out.println("2.响应数据:"+respData);//参数操作String[] dataArray = respData.split("&");Map<String, String> reslutMap = new HashMap<String, String>();for (String s : dataArray) {if (s.startsWith("transdata")) {reslutMap.put("transdata", s.substring(s.indexOf("=") + 1, s.length()));} else if (s.startsWith("signtype")) {reslutMap.put("signtype", s.substring(s.indexOf("=") + 1, s.length()));} else if (s.startsWith("sign")) {reslutMap.put("sign", s.substring(s.indexOf("=") + 1, s.length()));}}
//   X  System.out.println(new JSONObject().fromObject(respData).get("transid"));
//   Y   String transid2 = new JSONObject().fromObject(reslutMap.get("transdata")).getString("transid");String s = reslutMap.get("transdata");String transid = s.substring(12, s.length()-2);System.out.println("transid:"+transid);return transid;}/*** 3.获取支付链接* @param transid* @param appid* @param url_r* @param url_h* @return*/public static String GetPayUrl(String transid,String appid,String url_r,String url_h){JSONObject jsonObject=new JSONObject();jsonObject.put("tid",transid);jsonObject.put("app",appid);jsonObject.put("url_r",url_r);jsonObject.put("url_h",url_h);//1.post数据String transdata = jsonObject.toString();//2.sign参数String sign = RSA.sign(transdata, IpayConfig.PRIVATE_KEY, "UTF-8");String loca = "https://web.iapppay.com/pay/gateway?";String data = "data=" + URLEncoder.encode(transdata) + "&sign=" + URLEncoder.encode(sign)+ "&signtype=RSA";String url=loca+data; System.out.println("3.支付链接:"+url);return url;}/*** 支付主入口*******@param appid * @param waresid 商品编号* @param waresname 商品名称* @param cporderid 商户订单号* @param price 支付金额-可选* @param appuserid 唯一标识-1#23* @param cpprivateinfo 商户私有信息-可选* @param notifyurl 支付结果通知地址-可选* @return 支付链接*/public static String mainOrder(String appid, int waresid,String waresname,String cporderid ,float price,String appuserid,String cpprivateinfo,String notifyurl) {String reqData = ReqData(appid, waresid, waresname, cporderid, price, appuserid,cpprivateinfo,notifyurl);String transid = GetTransid(reqData);return GetPayUrl(transid, appid,IpayConfig.URL_R,IpayConfig.URL_H);}}

3.3OrderTest

package Test;import util.GetData;
import util.HttpUtils;public class OrderTest {public static void main(String[] args) {/** @param appid * @param waresid 商品编号  --唯一值,每次传参需要改变* @param waresname 商品名称  * @param cporderid 商户订单号  --唯一值,每次传参需要改变* @param price 支付金额-可选  * @param appuserid 唯一标识-1#23* @param cpprivateinfo 商户私有信息-可选* @param notifyurl 支付结果通知地址-可选* */String payUrl = OrderMain.mainOrder("appid", 007, "oyz", "201807121119", 5, "1#23","","");String HtmlData = GetData.getContentFromUrl(payUrl, "utf-8");System.out.println("服务器响应内容");System.out.println(HtmlData);}
}

3.4RSA

package util;import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;public class RSA {/*** 签名* @param transdata 发送数据* @param appvKey 私钥* @param input_charset 类型utf-8* @return*///Base64解码(私钥)---> RSA(Base64(私钥))--->MD5WithRSA(私钥..)--->Base64编码(签名(私钥..))public static String sign(String transdata, String appvKey, String input_charset) {try {PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(appvKey) ); KeyFactory     keyf = KeyFactory.getInstance("RSA");PrivateKey  priKey = keyf.generatePrivate(priPKCS8);Signature signature = Signature.getInstance("MD5WithRSA");signature.initSign(priKey);signature.update(transdata.getBytes(input_charset));byte[] signed = signature.sign();//System.out.println("响应数据:"+signed);return Base64.encode(signed);} catch (Exception e) {e.printStackTrace();}return null;}}

3.5Base64

/** Copyright (C) 2010 The MobileSecurePay Project* All right reserved.* author: shiqun.shi@alipay.com*/package util;public final class Base64 {//    static private final int     128           = 128;
//    static private final int     64         = 64;
//    static private final int     24   = 24;
//    static private final int     8             = 8;
//    static private final int     16           = 16;
//    static private final int     4             = 4;
//    static private final int     -128                 = -128;
//    static private final char    '='                  = '=';static private final boolean fDebug               = false;static final private byte[]  base64Alphabet       = new byte[128];static final private char[]  lookUpBase64Alphabet = new char[64];static {for (int i = 0; i < 128; ++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 == '=');}private static boolean isData(char octect) {return (octect < 128 && 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 * 8;if (lengthDataBits == 0) {return "";}int fewerThan24bits = lengthDataBits % 24;int numberTriplets = lengthDataBits / 24;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 & -128) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);byte val2 = ((b2 & -128) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);byte val3 = ((b3 & -128) == 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 groupsif (fewerThan24bits == 8) {b1 = binaryData[dataIndex];k = (byte) (b1 & 0x03);if (fDebug) {System.out.println("b1=" + b1);System.out.println("b1<<2 = " + (b1 >> 2));}byte val1 = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];encodedData[encodedIndex++] = '=';encodedData[encodedIndex++] = '=';} else if (fewerThan24bits == 16) {b1 = binaryData[dataIndex];b2 = binaryData[dataIndex + 1];l = (byte) (b2 & 0x0f);k = (byte) (b1 & 0x03);byte val1 = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);byte val2 = ((b2 & -128) == 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++] = '=';}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 spacesint len = removeWhiteSpace(base64Data);if (len % 4 != 0) {return null;//should be divisible by four}int numberQuadruple = (len / 4);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 nullb1 = 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 charactersif (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 3cQlb3 = 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 whitespaceint newSize = 0;int len = data.length;for (int i = 0; i < len; i++) {if (!isWhiteSpace(data[i])) {data[newSize++] = data[i];}}return newSize;}
}

3.6HttpUtils

package util;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;public class HttpUtils {private static final int TIME_OUT = 5;/*** 使用HTTP POST 发送文本* * @param httpUrl*            发送的地址* @param postBody*            发送的内容* @return 返回HTTP SERVER的处理结果,如果返回null,发送失败*/public static String sentPost(String httpUrl, String postBody) {return sentPost(httpUrl, postBody, "UTF-8", null);}/*** 使用HTTP POST 发送文本* * @param httpUrl*            发送的地址* @param postBody*            发送的内容* @return 返回HTTP SERVER的处理结果,如果返回null,发送失败*/public static String sentPost(String httpUrl, String postBody, String encoding) {return sentPost(httpUrl, postBody, encoding, null);}/*** 使用HTTP POST 发送文本* @param httpUrl   目的地址* @param postBody  post的包体* @param headerMap 增加的Http头信息* @return*/public static String sentPost(String httpUrl, String postBody, Map<String, String> headerMap) {return sentPost(httpUrl, postBody, "UTF-8", headerMap);}/*** 使用HTTP POST 发送文本* * @param httpUrl*            发送的地址* @param postBody*            发送的内容* @param encoding*            发送的内容的编码* @param headerMap 增加的Http头信息          * @return 返回HTTP SERVER的处理结果,如果返回null,发送失败* .................*/public static String sentPost(String httpUrl, String postBody, String encoding, Map<String, String> headerMap) {HttpURLConnection httpCon = null;String responseBody = null;URL url = null;try {url = new URL(httpUrl);} catch (MalformedURLException e1) {return null;}try {httpCon = (HttpURLConnection) url.openConnection();} catch (IOException e1) {return null;}if (httpCon == null) {return null;}httpCon.setDoOutput(true);httpCon.setConnectTimeout(TIME_OUT * 1000);httpCon.setReadTimeout(TIME_OUT * 1000);httpCon.setDoOutput(true);httpCon.setUseCaches(false);try {httpCon.setRequestMethod("POST");} catch (ProtocolException e1) {return null;}//----nullif (headerMap != null) {Iterator<Entry<String, String>> iterator = headerMap.entrySet().iterator();while (iterator.hasNext()) {Entry<String, String> entry = iterator.next();httpCon.addRequestProperty(entry.getKey(), entry.getValue());}}OutputStream output;try {output = httpCon.getOutputStream();} catch (IOException e1) {return null;}try {output.write(postBody.getBytes(encoding));} catch (UnsupportedEncodingException e1) {return null;} catch (IOException e1) {return null;}try {output.flush();output.close();} catch (IOException e1) {return null;}// 开始读取返回的内容InputStream in;try {in = httpCon.getInputStream();} catch (IOException e1) {return null;}/*** 这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。* 需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,* 但如果是用于网络操作,就经常会遇到一些麻烦。* 比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,* 感觉有点莫名其妙,怎么也找不到原因。* 其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。* 本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。* 对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。* * 经常出现size为0的情况,导致下面readCount为0使之死循环(while (readCount != -1) {xxxx}),出现死机问题*/int size = 0;try {size = in.available();} catch (IOException e1) {return null;}if (size == 0) {size = 1024;}byte[] readByte = new byte[size];// 读取返回的内容int readCount = -1;try {readCount = in.read(readByte, 0, size);} catch (IOException e1) {return null;}ByteArrayOutputStream baos = new ByteArrayOutputStream();while (readCount != -1) {baos.write(readByte, 0, readCount);try {readCount = in.read(readByte, 0, size);} catch (IOException e) {return null;}}try {responseBody = new String(baos.toByteArray(), encoding);} catch (UnsupportedEncodingException e) {return null;} finally {if (httpCon != null) {httpCon.disconnect();}if (baos != null) {try {baos.close();} catch (IOException e) {}}}return responseBody;}
}

3.7IpayConfig

package util;/*** @author Administrator* *  支付公用配置*/
public class IpayConfig {
//  public  static  String appName = "";//   public  static  String appId = "";// public  static  int waresId=1;// 字符编码格式 ,目前支持  utf-8
//  public final static String input_charset = "utf-8";//    public static String appid= "爱贝给的商户id";//私钥-固定public final static String PRIVATE_KEY = "爱贝给的私钥==";//公钥-固定public final static String PUBLIC_KEY = "爱贝给的公钥==";public final static String URL_R ="http://58.250.160.241:8888/IapppayCpSyncForPHPDemo/Test.php";public final static String URL_H ="http://58.250.160.241:8888/IapppayCpSyncForPHPDemo/Test.php";
}

3.8GetData

package util;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;public class GetData {/*** 从网页上获取数据* @param myUrl URL地址* @return 网页上的数据,string类型*/public static String getContentFromUrl(String myUrl, String charset) {StringBuffer sb = new StringBuffer();URL url;try {url = new URL(myUrl);URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();Scanner sc = new Scanner(is, charset);while (sc.hasNextLine()) {sb.append(sc.nextLine()).append("\r\n");}sc.close();is.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}public static void main(String[] args) {String contentFromUrl = getContentFromUrl("", "utf-8");System.out.println(contentFromUrl);}}

java调用爱贝支付相关推荐

  1. cocos2dx android 接入爱贝支付平台sdk记录

    问题: 今天在接入爱贝支付平台的时候,出现一个错误: 01-28 18:00:05.614: E/AndroidRuntime(25801): FATAL EXCEPTION: GLThread 54 ...

  2. cocos2dx android 爱贝支付平台接入记录

    问题: 今天在接入爱贝支付平台的时候,出现一个错误: 01-28 18:00:05.614: E/AndroidRuntime(25801): FATAL EXCEPTION: GLThread 54 ...

  3. 爱贝支付 - 服务端 - nodejs实现

    爱贝支付nodejs实现,完整的代码,复制即可执行 总结几个小坑: 1. 使用私钥进行签名的问题,爱贝支付的签名规则是采用RSA MD5数字签名算法,私钥签名.公钥验签 所以本案例中用的是 nodej ...

  4. 关于7.0手机爱贝支付转圈问题-java.lang.SecurityException: getSubscriberId: Neither user 10191 nor current process

    最近测试发现爱贝渠道的包在支付的时候一直"转圈",没有弹出支付界面. 看log发现是: java.lang.SecurityException: getSubscriberId: ...

  5. Java调用支付宝完成支付

    话不多说,直接开撸!!! import com.egzosn.pay.ali.api.AliPayConfigStorage; import com.egzosn.pay.ali.api.AliPay ...

  6. java调用爱查快递接口

    //方法 package common; import java.io.IOException; import java.io.InputStream; import java.net.Malform ...

  7. Unity3d Android SDK接入解析(三)接入Android Library的理解(爱贝云支付为例)

    一.前言 写这个主题的原因,出于刚入门u3d,需要接入爱贝云支付的内容,苦于爱贝支付是一个Android的Library库,看到网上漫天遍野都是Android接入的帖子,但却没有我想要的关于Libra ...

  8. 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技

    手把手教你用JAVA调用Websocket实现"声音转换"功能(变声)标贝科技 前言 什么是声音转换? 基于深度学习和迁移学习技术,精准将原说话人的声音转换为目标说话人,同时保留原 ...

  9. 作为移动支付行业引领者,爱贝面临着哪些挑战?

    在移动支付战场厮杀火热,移动支付数额年年拔高的时候,当人们谈起支付平台及服务时,最令人耳熟能详就是支付宝.微信.银联等这些巨头,伴随着新零售等各行业的产业升级与日益激烈的竞争,智能支付成了众多商户日益 ...

最新文章

  1. php优先队列,PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
  2. 拿 C# 搞函数式编程
  3. 牛客NOIP暑期七天营-提高组1
  4. 前端学习(1399):多人管理19项目拦截器
  5. 通过一个例子介绍 IDA pro 的简单使用
  6. Java报警110_Java入门基础SL110
  7. JavaScript BigInt 尝鲜
  8. HDU6383 p1m2
  9. 所有for循环都可以用while循环改写python_python-for循环与while循环
  10. css 固定宽度,自动换行
  11. NS3 Tracing System详解
  12. OSChina 周三乱弹 ——程序员是将咖啡转变成代码的工具
  13. linux串口无线透传,一种无线串口透传系统的制作方法
  14. 股票交易接口程序概述
  15. 微信小程序ssm电影院购票+后台管理系统|前后分离VUE
  16. Python基础学习第七天
  17. 宝石排列 java_重新排列序列以最大化顺序差异,红宝石
  18. android设置背景色为全透明和半透明
  19. 接口技术七段数码管c语言,031 实例7-七段数码管绘制
  20. 运营商造势 CP、SP发力手机游戏

热门文章

  1. Microbiome综述:脊椎动物的皮肤微生物
  2. 【Shader特效3】旋转扭动效果顶点着色器实现
  3. 关于双边滤波的一些理解
  4. SOM网络1:原理讲解
  5. 用Hyperledger cello的0.9.0-h3c分支创建一套区块链系统
  6. 方格1010+颠覆经典俄罗斯方块逻辑玩法的手游
  7. WORD批量修改文献引用为上标
  8. 『中级篇』docker导学(一)
  9. 一个监听home键锁屏键的工具类
  10. C语言中的switch语句基本用法