不说废话,直接上代码

先是工具类(注意签名时要排序):

  1. import java.io.BufferedReader;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.net.ConnectException;
  9. import java.net.HttpURLConnection;
  10. import java.net.URL;
  11. import java.security.KeyStore;
  12. import java.util.ArrayList;
  13. import java.util.Collections;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.Random;
  18. import java.util.Set;
  19. import java.util.SortedMap;
  20. import java.util.TreeMap;
  21.  
  22. import javax.net.ssl.HttpsURLConnection;
  23. import javax.net.ssl.SSLContext;
  24.  
  25. import org.apache.http.Consts;
  26. import org.apache.http.HttpEntity;
  27. import org.apache.http.client.methods.CloseableHttpResponse;
  28. import org.apache.http.client.methods.HttpPost;
  29. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  30. import org.apache.http.entity.StringEntity;
  31. import org.apache.http.impl.client.CloseableHttpClient;
  32. import org.apache.http.impl.client.HttpClients;
  33. import org.apache.http.ssl.SSLContexts;
  34. import org.apache.http.util.EntityUtils;
  35. import org.jdom.Document;
  36. import org.jdom.Element;
  37. import org.jdom.input.SAXBuilder;
  38.  
  39. import com.system.property.WXProperty;
  40. import com.system.util.Tools;
  41.  
  42. public class PayCommonUtil {
  43.  
  44. /**
  45. * post请求并得到返回结果
  46. * @param requestUrl
  47. * @param requestMethod
  48. * @param output
  49. * @return
  50. */
  51. public static String httpsRequest21(String requestUrl, String requestMethod, String output) {
  52. try{
  53. URL url = new URL(requestUrl);
  54. HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
  55. connection.setDoOutput(true);
  56. connection.setDoInput(true);
  57. connection.setUseCaches(false);
  58. connection.setRequestMethod(requestMethod);
  59. if (null != output) {
  60. OutputStream outputStream = connection.getOutputStream();
  61. outputStream.write(output.getBytes("UTF-8"));
  62. outputStream.close();
  63. }
  64. // 从输入流读取返回内容
  65. InputStream inputStream = connection.getInputStream();
  66. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
  67. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  68. String str = null;
  69. StringBuffer buffer = new StringBuffer();
  70. while ((str = bufferedReader.readLine()) != null) {
  71. buffer.append(str);
  72. }
  73. bufferedReader.close();
  74. inputStreamReader.close();
  75. inputStream.close();
  76. inputStream = null;
  77. connection.disconnect();
  78. return buffer.toString();
  79. }catch(Exception ex){
  80. ex.printStackTrace();
  81. }
  82.  
  83. return "";
  84. }
  85.  
  86. // 随机字符串生成
  87. public static String getRandomString(int length) { // length表示生成字符串的长度
  88. String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  89. Random random = new Random();
  90. StringBuffer sb = new StringBuffer();
  91. for (int i = 0; i < length; i++) {
  92. int number = random.nextInt(base.length());
  93. sb.append(base.charAt(number));
  94. }
  95. return sb.toString();
  96. }
  97.  
  98. // 请求xml组装
  99. public static String getRequestXml(SortedMap<String, Object> parameters) {
  100. StringBuffer sb = new StringBuffer();
  101. sb.append("<xml>");
  102. Set es = parameters.entrySet();
  103.  
  104. Iterator it = es.iterator();
  105. while (it.hasNext()) {
  106. Map.Entry entry = (Map.Entry) it.next();
  107. String key = (String) entry.getKey();
  108. // String value = (String) entry.getValue();
  109. Object value = entry.getValue();
  110. // || "body".equalsIgnoreCase(key) || "sign".equalsIgnoreCase(key)
  111. if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key) || "sign".equalsIgnoreCase(key)) {
  112. sb.append("<" + key + ">" + "<![CDATA[" + value + "]]></" + key + ">");
  113. } else {
  114. sb.append("<" + key + ">" + value + "</" + key + ">");
  115. }
  116. }
  117. sb.append("</xml>");
  118. return sb.toString();
  119. }
  120.  
  121. // 生成签名
  122. public static String createSign(String characterEncoding, SortedMap<String, Object> parameterMap) {
  123. if (parameterMap == null) {
  124. return null;
  125. }
  126. StringBuffer sb = new StringBuffer();
  127. List<String> keys = new ArrayList<>(parameterMap.keySet());
  128. Collections.sort(keys);
  129.  
  130. for (int i = 0; i < keys.size(); i++) {
  131. String key = keys.get(i);
  132. // String value = (String) parameters.get(key);
  133. Object value = parameterMap.get(key);
  134. // if (Tools.notEmpty(value)) {
  135. sb.append((i == 0 ? "" : "&") + key + "=" + value);
  136. // }
  137. }
  138. sb.append("&key=" + WXProperty.get("API_KEY"));
  139. System.out.println("【生成签名 】" + sb.toString());
  140. String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
  141. return sign;
  142. }
  143.  
  144. // 微信支付请求
  145. public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
  146. try {
  147. URL url = new URL(requestUrl);
  148. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  149. conn.setDoOutput(true);
  150. conn.setDoInput(true);
  151. conn.setUseCaches(false);
  152. // 设置请求方式(GET/POST)
  153. conn.setRequestMethod(requestMethod);
  154. conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
  155. // 当outputStr不为null时向输出流写数据
  156. if (null != outputStr) {
  157. OutputStream outputStream = conn.getOutputStream();
  158. // 注意编码格式
  159. outputStream.write(outputStr.getBytes("UTF-8"));
  160. outputStream.close();
  161. }
  162. // 从输入流读取返回内容
  163. InputStream inputStream = conn.getInputStream();
  164. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
  165. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  166. String str;
  167. StringBuffer buffer = new StringBuffer();
  168. while ((str = bufferedReader.readLine()) != null) {
  169. buffer.append(str);
  170. }
  171. // 释放资源
  172. bufferedReader.close();
  173. inputStreamReader.close();
  174. inputStream.close();
  175. conn.disconnect();
  176. return buffer.toString();
  177. } catch (ConnectException ce) {
  178. System.out.println("连接超时:" + ce);
  179. } catch (Exception e) {
  180. System.out.println("https请求异常" + e);
  181. }
  182. return null;
  183. }
  184.  
  185. // 退款的请求方法
  186. public static String httpsRequest2(String requestUrl, String requestMethod, String outputStr) throws Exception {
  187. KeyStore keyStore = KeyStore.getInstance("PKCS12");
  188. StringBuilder res = new StringBuilder("");
  189. FileInputStream instream = new FileInputStream(new File("/home/apiclient_cert.p12"));
  190. try {
  191. keyStore.load(instream, "".toCharArray());
  192. } finally {
  193. instream.close();
  194. }
  195.  
  196. // Trust own CA and all self-signed certs
  197. SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1313329201".toCharArray()).build();
  198. // Allow TLSv1 protocol only
  199. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
  200. SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
  201. CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
  202. try {
  203.  
  204. HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
  205. httpost.addHeader("Connection", "keep-alive");
  206. httpost.addHeader("Accept", "*/*");
  207. httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  208. httpost.addHeader("Host", "api.mch.weixin.qq.com");
  209. httpost.addHeader("X-Requested-With", "XMLHttpRequest");
  210. httpost.addHeader("Cache-Control", "max-age=0");
  211. httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
  212. StringEntity entity2 = new StringEntity(outputStr, Consts.UTF_8);
  213. httpost.setEntity(entity2);
  214. System.out.println("executing request" + httpost.getRequestLine());
  215.  
  216. CloseableHttpResponse response = httpclient.execute(httpost);
  217.  
  218. try {
  219. HttpEntity entity = response.getEntity();
  220.  
  221. System.out.println("----------------------------------------");
  222. System.out.println(response.getStatusLine());
  223. if (entity != null) {
  224. System.out.println("Response content length: " + entity.getContentLength());
  225. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
  226. String text = "";
  227. res.append(text);
  228. while ((text = bufferedReader.readLine()) != null) {
  229. res.append(text);
  230. System.out.println(text);
  231. }
  232.  
  233. }
  234. EntityUtils.consume(entity);
  235. } finally {
  236. response.close();
  237. }
  238. } finally {
  239. httpclient.close();
  240. }
  241. return res.toString();
  242.  
  243. }
  244.  
  245. // xml解析
  246. public static SortedMap<String, Object> doXMLParse(String strxml){
  247. strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
  248.  
  249. if (null == strxml || "".equals(strxml)) {
  250. return null;
  251. }
  252.  
  253. SortedMap<String, Object> m = new TreeMap<>();
  254.  
  255. InputStream in;
  256. try {
  257. in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
  258. SAXBuilder builder = new SAXBuilder();
  259. Document doc = builder.build(in);
  260. Element root = doc.getRootElement();
  261. List list = root.getChildren();
  262. Iterator it = list.iterator();
  263. while (it.hasNext()) {
  264. Element e = (Element) it.next();
  265. String k = e.getName();
  266. String v = "";
  267. List children = e.getChildren();
  268. if (children.isEmpty()) {
  269. v = e.getTextNormalize();
  270. } else {
  271. v = getChildrenText(children);
  272. }
  273.  
  274. m.put(k, v);
  275. }
  276.  
  277. // 关闭流
  278. in.close();
  279. } catch (Exception e1) {
  280. e1.printStackTrace();
  281. }
  282.  
  283. return m;
  284. }
  285.  
  286. public static String getChildrenText(List children) {
  287. StringBuffer sb = new StringBuffer();
  288. if (!children.isEmpty()) {
  289. Iterator it = children.iterator();
  290. while (it.hasNext()) {
  291. Element e = (Element) it.next();
  292. String name = e.getName();
  293. String value = e.getTextNormalize();
  294. List list = e.getChildren();
  295. sb.append("<" + name + ">");
  296. if (!list.isEmpty()) {
  297. sb.append(getChildrenText(list));
  298. }
  299. sb.append(value);
  300. sb.append("</" + name + ">");
  301. }
  302. }
  303.  
  304. return sb.toString();
  305. }
  306.  
  307. /**
  308. * 验证微信回调签名
  309. * @Description
  310. * @Author zhaozhenhua
  311. * @date 2018年5月10日
  312. * @param pd
  313. * @return
  314. * @throws Exception
  315. */
  316. public static boolean checkWXSign(SortedMap<String, Object> receiveMap) {
  317. String signFromAPIResponse = (String) receiveMap.get("sign");
  318. if (Tools.isEmpty(signFromAPIResponse)) {
  319. System.out.println("API返回的数据签名数据不存在,有可能被第三方篡改!!!");
  320. return false;
  321. }
  322. //清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
  323. receiveMap.remove("sign");
  324. String responseSign = createSign("utf-8", receiveMap);
  325. if (!responseSign.equals(signFromAPIResponse)) {
  326. //签名验不过,表示这个API返回的数据有可能已经被篡改了
  327. System.out.println("API返回的数据签名验证不通过,有可能被第三方篡改!!! responseSign生成的签名为" + responseSign);
  328. return false;
  329. }
  330.  
  331. System.out.println("服务器回包里面的签名是:" + signFromAPIResponse);
  332. return true;
  333. }
  334.  
  335. }

配置文件信息读取:

  1. import java.io.FileNotFoundException;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5.  
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8.  
  9. public class WXProperty {
  10. private static final Logger logger = LoggerFactory.getLogger(WXProperty.class);
  11.  
  12. private static Properties props;
  13. static{
  14. loadProps();
  15. }
  16.  
  17. synchronized static private void loadProps(){
  18. props = new Properties();
  19. InputStream in = null;
  20.  
  21. try {
  22. in = WXProperty.class.getClassLoader().getResourceAsStream("wxinfo.properties");
  23. props.load(in);
  24. } catch (FileNotFoundException e) {
  25. logger.error("payment.properties文件未找到");
  26. } catch (IOException e) {
  27. logger.error("出现IOException");
  28. } finally {
  29. try {
  30. if(null != in) {
  31. in.close();
  32. }
  33. } catch (IOException e) {
  34. logger.error("payment.properties文件流关闭出现异常");
  35. }
  36. }
  37. }
  38.  
  39. //读取key对应的value
  40. public static String get(String key){
  41. if(null == props) {
  42. loadProps();
  43. }
  44. return props.getProperty(key);
  45. }
  46.  
  47. }

配置文件(前三个配置为微信申请APP支付通过后给的,而回调地址是自己定义的,在微信统一下单成功后会随着相应信息返回给前端,前端处理成功后执行这个回调接口):

  1. #服务号的应用ID
  2. APP_ID = XXXXXX
  3. #商户号
  4. MCH_ID = XXXXXXX
  5. #API密钥(前三个为微信申请获得)
  6. API_KEY = XXXXXXX
  7. #签名加密方式
  8. SIGN_TYPE = MD5
  9. #微信支付证书名称
  10. CERT_PATH = XXXXX
  11. #微信回调地址(自己定义)
  12. notify_url = XXXXX/success

MD5加密方法:

  1. public class MD5Util {
  2.  
  3. private static String byteArrayToHexString(byte b[]) {
  4. StringBuffer resultSb = new StringBuffer();
  5. for (int i = 0; i < b.length; i++)
  6. resultSb.append(byteToHexString(b[i]));
  7.  
  8. return resultSb.toString();
  9. }
  10.  
  11. private static String byteToHexString(byte b) {
  12. int n = b;
  13. if (n < 0)
  14. n += 256;
  15. int d1 = n / 16;
  16. int d2 = n % 16;
  17. return hexDigits[d1] + hexDigits[d2];
  18. }
  19.  
  20. public static String MD5Encode(String origin, String charsetname) {
  21. String resultString = null;
  22. try {
  23. resultString = new String(origin);
  24. MessageDigest md = MessageDigest.getInstance("MD5");
  25. if (charsetname == null || "".equals(charsetname))
  26. resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
  27. else
  28. resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
  29. } catch (Exception exception) {
  30. }
  31. return resultString;
  32. }
  33.  
  34. private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
  35. }

微信支付统一下单接口封装的方法:

  1. public synchronized static SortedMap<String, Object> weixinPrePay (PageData pd) throws JDOMException, IOException{
  2. Map<String,String> returnMap = new HashMap<>();
  3. String trade_no = (String) pd.get("ORDERNUMBER");
  4. //支付金额
  5. BigDecimal totalAmount = new BigDecimal((String)pd.get("ORDERMONEY"));
  6. //描述(以商品标题做为描述)
  7. String description = "XXXX:"+trade_no;
  8. //预支付
  9. SortedMap<String, Object> parameterMap = new TreeMap<String, Object>();
  10. parameterMap.put("appid", WXProperty.get("APP_ID"));
  11. parameterMap.put("mch_id", WXProperty.get("MCH_ID"));
  12. parameterMap.put("nonce_str", PayCommonUtil.getRandomString(32));
  13. parameterMap.put("body", description);
  14. parameterMap.put("out_trade_no", trade_no);
  15. parameterMap.put("fee_type", "CNY");
  16. BigDecimal total = totalAmount.multiply(new BigDecimal(100));
  17. //parameterMap.put("total_fee", total.intValue()+"");
  18. parameterMap.put("total_fee", 1+"");
  19. parameterMap.put("spbill_create_ip", pd.get("spbillCreateIp"));
  20. parameterMap.put("notify_url", WXProperty.get("notify_url"));
  21. parameterMap.put("trade_type", "APP");
  22. parameterMap.put("sign_type", "MD5");
  23. parameterMap.put("attach", pd.get("ORDERTYPE"));//附加数据
  24. String sign = PayCommonUtil.createSign("UTF-8", parameterMap) ;
  25. parameterMap.put("sign", sign);
  26.  
  27. String requestXML = PayCommonUtil.getRequestXml(parameterMap);
  28.  
  29. System.out.println("【转换为xml格式的参数】 "+requestXML);
  30. String resultXML = PayCommonUtil.httpsRequest(
  31. "https://api.mch.weixin.qq.com/pay/unifiedorder","POST", requestXML);
  32.  
  33. System.out.println("【返回的XML】 " + resultXML);
  34. Map mapResult = PayCommonUtil.doXMLParse(resultXML);
  35. String returnCode = (String) mapResult.get("return_code");
  36. System.out.println("【返回内容 】 "+returnCode);
  37. if("SUCCESS".equals(returnCode)){
  38. String resultCode = (String) mapResult.get("result_code");
  39. if("SUCCESS".equals(resultCode)){
  40. String prepay_id = (String) mapResult.get("prepay_id");
  41.  
  42. SortedMap<String, Object> finalpackage = new TreeMap<String, Object>();
  43. finalpackage.put("appid", WXProperty.get("APP_ID"));
  44. finalpackage.put("partnerid", WXProperty.get("MCH_ID"));
  45. finalpackage.put("prepayid", prepay_id);
  46. String noncestr = PayCommonUtil.getRandomString(32);
  47. finalpackage.put("noncestr", noncestr);
  48. String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
  49. finalpackage.put("timestamp", timestamp);
  50. finalpackage.put("package", "Sign=WXPay");
  51. sign = PayCommonUtil.createSign("UTF-8", finalpackage) ;
  52. SortedMap<String, Object> returnmap = new TreeMap<String, Object>();
  53. returnmap.put("appid", WXProperty.get("APP_ID"));
  54. returnmap.put("partnerId", WXProperty.get("MCH_ID"));
  55. returnmap.put("prepayId", prepay_id);
  56. returnmap.put("nonceStr", noncestr);
  57. returnmap.put("timeStamp", timestamp);
  58. returnmap.put("package", "Sign=WXPay");
  59. returnmap.put("sign", sign);
  60. return returnmap;
  61. }else{
  62. String errCodeDes = (String) mapResult.get("err_code_des");
  63. returnMap.put("errCodeDes", errCodeDes);
  64. }
  65. }else{
  66. String returnMsg = (String) mapResult.get("return_msg");
  67. returnMap.put("returnMsg", returnMsg);
  68. }
  69. return null;
  70. }

微信支付回调地址:

  1. @RequestMapping(value = "/success")
  2. public String wxpaySucc(HttpServletRequest request){
  3. logger.info("微信支付回调");
  4.  
  5. //商户处理后同步返回给微信参数:
  6. String xmlResultSuccess = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
  7. String xmlResultFailure = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
  8.  
  9. SortedMap<String, Object> params = null;
  10. try {
  11. InputStream inStream = request.getInputStream();
  12. ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
  13. byte[] buffer = new byte[1024];
  14. int len = 0;
  15. while ((len = inStream.read(buffer)) != -1) {
  16. outSteam.write(buffer, 0, len);
  17. }
  18. String resultxml = new String(outSteam.toByteArray(), "utf-8");
  19. params = PayCommonUtil.doXMLParse(resultxml);
  20. logger.info("微信回调的信息:解析XML得到key:value");
  21. for (Object b : params.keySet()) {
  22. logger.info("key="+b+":"+"value="+params.get(b));
  23. }
  24. outSteam.close();
  25. inStream.close();
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. logger.info("回调xml解析失败");
  29. }
  30. //验证签名
  31. boolean signVerified = PayCommonUtil.checkWXSign(params);
  32. logger.info("验证签名:"+signVerified);
  33. if (!signVerified) {
  34. // 支付失败,失败业务逻辑处理
  35. //将订单状态设置为待支付
  36.  
  37. return xmlResultFailure;
  38. } else {
  39. String return_code = (String) params.get("return_code");//状态
  40. String out_trade_no = (String) params.get("out_trade_no");//订单号
  41. String ORDERTYPE = (String) params.get("attach");//商家数据包
  42. System.out.println("订单号out_trade_no:"+out_trade_no);
  43.  
  44. //防止微信重复通知
  45. PageData pd = new PageData();
  46. pd.put("ORDERNUMBER", out_trade_no);
  47. try {
  48. PageData payInfo = alipayInService.getPayInfo(pd);
  49. if(payInfo != null){
  50. return xmlResultSuccess;
  51. }
  52. } catch (Exception e1) {
  53. e1.printStackTrace();
  54. }
  55.  
  56. if (return_code.equals("SUCCESS")) {
  57. if (out_trade_no != null) {
  58. //付款成功业务逻辑处理
  59. return xmlResultSuccess;
  60. default:
  61. break;
  62. }
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }else{
  68. logger.info("微信手机支付回调失败订单号:{}"+out_trade_no);
  69. return xmlResultFailure;
  70. }
  71. }
  72. return null;
  73. }

微信APP支付-java后台实现的更多相关文章

  1. 微信app支付java后台流程、原理分析及nei网穿透

    一.流程步骤 本实例是基于springmvc框架编写 1.执行流程           当手机端app(就是你公司开发的app)在支付页面时,调起服务端(后台第1个创建订单接口)接口,后台把需要调起微 ...

  2. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

    java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写     一.流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付 ...

  3. 手把手教你完成App支付JAVA后台-支付宝支付JAVA

    接着上一篇博客,我们暂时完成了手机端的部分支付代码,接下来,我们继续写后台的代码. 后台基本需要到以下几个参数,我都将他们写在了properties文件中: 支付宝参数 AliPay.payURL = ...

  4. 微信APP支付Java后端回调处理

    package com.gaoxiao.framework.controller.gaojia; import com.gaoxiao.framework.commonfiles.entity.Sta ...

  5. .Net后台实现微信APP支付

    上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是&qu ...

  6. 微信app支付(android端+java后台)

    本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...

  7. 微信app支付android客户端以及.net服务端实现

    由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ...

  8. php开发微信APP支付接口

    之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...

  9. H5使用codovar插件实现微信支付(微信APP支付模式,前端)

    H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...

随机推荐

  1. Sed 实记 · laoless's Blog

    sed编辑命令 p 打印匹配行 = 打印文件行号 a 在定位行之后追加文本 i 在定位行之前插入文本 d 删除定位行 c 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件读取文本 ...

  2. Android注解支持Support Annotations详解

    ###注解支持(Support Annotations)Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现 ...

  3. 人心和隐私怎么防?“防出轨”APP让道德滑落

    ​ 王尔德曾说过,"一个人应该永远保持一点神秘感".让·保·里克特也表示,:"一个人泄露了秘密,哪怕一丝一毫,就再也得不到安宁了".可见,对于自然人来说,保有自 ...

  4. 在idea下遇到的问题汇总(间接性更新)

    在idea下遇到的问题汇总(间接性更新) tomcat下的jsp代码问题: 在idea的环境下,遇到jsp代码.符号失效,首先需要考虑到jar包没有引入,情况如图: 这种情况是因为jar包没有导入进去 ...

  5. 前后端分离下的跨域CAS请求

    最重要的两点: ajax请求跨域的时候,默认不会携带cookie. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起a ...

  6. [红日安全]Web安全Day9 - 文件下载漏洞实战攻防

    本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...

  7. C++ non-const lvalue reference cannot bind to a temporary

    1. 问题代码 #include <iostream> #include <vector> //注意begin和end形参都声明为引用 bool find_int(std::v ...

  8. proteus pro 8.9 安装及汉化教程

    最近由于网上上课老师要求我们自己安装proteus这款仿真软件,所以笔者也安装了最新款版的proteus pro 8.9,分享给大家安装心得,也包含汉化过程,希望大家能用软件好好学习. 备注:感谢博主 ...

  9. R调用C++示例

    sourceCpp {Rcpp}:Source C++ Code from a File or String sourceCpp(file = "", code = NULL, e ...

  10. [android]com.android.support:appcompat-v7:XXX 包导入无法Build

    在学习<Android编程权威指南>时,按书中要求添加com.android.support:appcompat的依赖,然后编译不通过,提示如下问题: 大概意思是,Android Pie之 ...