ここでは、この記事では Java を使用してミニ プログラムのバックエンドを作成しています。会社はしばらく前にミニ プログラムの支払いを行う必要があるため、ここで私が作成したミニ プログラムのバックエンドの支払いコントローラーを記録します。この文書については、公式 WeChat 支払い文書 (アドレス: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1) を参照してください。
推奨コース: Java チュートリアル 。
早速、コードに進みましょう:
PayController
@Api(tags = "支付模块") @RestController @RequestMapping("") public class PayController { @ApiOperation(value = "请求支付接口") @RequestMapping(value = "/wxPay", method = RequestMethod.POST) public JSONObject wxPay(HttpServletRequest request) { try { //生成的随机字符串 String nonce_str = getRandomStringByLength(32); //商品名称 String body = "测试商品名称"; //获取客户端的ip地址 String spbill_create_ip = getIpAddr(request); //组装参数,用户生成统一下单接口的签名 Map<string> packageParams = new HashMap(); packageParams.put("appid", WechatConfig.appid); packageParams.put("mch_id", WechatConfig.mch_id); packageParams.put("nonce_str", nonce_str); packageParams.put("body", body); packageParams.put("out_trade_no", payOrderId + "");//商户订单号,自己的订单ID packageParams.put("total_fee", 100 + "");//支付金额,这边需要转成字符串类型,否则后面的签名会失败 packageParams.put("spbill_create_ip", spbill_create_ip); packageParams.put("notify_url", WechatConfig.notify_url);//支付成功后的回调地址 packageParams.put("trade_type", WechatConfig.TRADETYPE);//支付方式 packageParams.put("openid", openId + "");//用户的openID,自己获取 String prestr = PayUtil.createLinkString(packageParams); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 //MD5运算生成签名,这里是第一次签名,用于调用统一下单接口 String mysign = PayUtil.sign(prestr, WechatConfig.key, "utf-8").toUpperCase(); //拼接统一下单接口使用的xml数据,要将上一步生成的签名一起拼接进去 String xml = "<xml>" + "<appid>" + WechatConfig.appid + "</appid>" + "" + "<mch_id>" + WechatConfig.mch_id + "</mch_id>" + "<nonce_str>" + nonce_str + "</nonce_str>" + "<notify_url>" + WechatConfig.notify_url + "</notify_url>" + "<openid>" + openid + "</openid>" + "<out_trade_no>" + payOrderId + "</out_trade_no>" + "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" + "<total_fee>" + 100 + "</total_fee>"//支付的金额,单位:分 + "<trade_type>" + WechatConfig.TRADETYPE + "</trade_type>" + "<sign>" + mysign + "</sign>" + "</xml>"; //调用统一下单接口,并接受返回的结果 String result = PayUtil.httpRequest(WechatConfig.pay_url, "POST", xml); // 将解析结果存储在HashMap中 Map map = PayUtil.doXMLParse(result); String return_code = (String) map.get("return_code");//返回状态码 String result_code = (String) map.get("result_code");//返回状态码 Map<string> response = new HashMap<string>();//返回给小程序端需要的参数 if (return_code == "SUCCESS" && return_code.equals(result_code)) { String prepay_id = (String) map.get("prepay_id");//返回的预付单信息 response.put("nonceStr", nonce_str); response.put("package", "prepay_id=" + prepay_id); Long timeStamp = System.currentTimeMillis() / 1000; response.put("timeStamp", timeStamp + "");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误 //拼接签名需要的参数 String stringSignTemp = "appId=" + WechatConfig.appid + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + timeStamp; //再次签名,这个签名用于小程序端调用wx.requesetPayment方法 String paySign = PayUtil.sign(stringSignTemp, WechatConfig.key, "utf-8").toUpperCase(); response.put("paySign", paySign); } response.put("appid", WechatConfig.appid); return Response.succ(response); } catch (Exception e) { e.printStackTrace(); } return null; } //这里是支付回调接口,微信支付成功后会自动调用 @RequestMapping(value = "/wxNotify", method = RequestMethod.POST) public void wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream())); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); //sb为微信返回的xml String notityXml = sb.toString(); String resXml = ""; Map map = PayUtil.doXMLParse(notityXml); String returnCode = (String) map.get("return_code"); if ("SUCCESS".equals(returnCode)) { //验证签名是否正确 Map<string> validParams = PayUtil.paraFilter(map); //回调验签时需要去除sign和空值参数 String prestr = PayUtil.createLinkString(validParams); //根据微信官网的介绍,此处不仅对回调的参数进行验签,还需要对返回的金额与系统订单的金额进行比对等 if (PayUtil.verify(prestr, (String) map.get("sign"), WechatConfig.key, "utf-8")) { /**此处添加自己的业务逻辑代码start**/ //注意要判断微信支付重复回调,支付成功后微信会重复的进行回调 /**此处添加自己的业务逻辑代码end**/ //通知微信服务器已经支付成功 resXml = "<xml>" + "<return_code></return_code>" + "<return_msg></return_msg>" + "</xml> "; } } else { resXml = "<xml>" + "<return_code></return_code>" + "<return_msg></return_msg>" + "</xml> "; } BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); } //获取随机字符串 private String getRandomStringByLength(int length) { String base = "abcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i <p>上記のコードでは、次のコードを使用しています。 PayUtil と WechatConfig には 2 つのクラスがあり、1 つは構成クラス、もう 1 つはツール クラスです。コードは次のとおりです: </p> <p><strong>PayUtil</strong></p> <pre class="brush:php;toolbar:false">public class PayUtil { /** * 签名字符串 * * @param text 需要签名的字符串 * @param key 密钥 * @param input_charset 编码格式 * @return 签名结果 */ public static String sign(String text, String key, String input_charset) { text = text + "&key=" + key; return DigestUtils.md5Hex(getContentBytes(text, input_charset)); } /** * 签名字符串 * * @param text 需要签名的字符串 * @param sign 签名结果 * @param key 密钥 * @param input_charset 编码格式 * @return 签名结果 */ public static boolean verify(String text, String sign, String key, String input_charset) { text = text + key; String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset)); if (mysign.equals(sign)) { return true; } else { return false; } } /** * @param content * @param charset * @return * @throws java.security.SignatureException * @throws UnsupportedEncodingException */ public static byte[] getContentBytes(String content, String charset) { if (charset == null || "".equals(charset)) { return content.getBytes(); } try { return content.getBytes(charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset); } } private static boolean isValidChar(char ch) { if ((ch >= '0' && ch = 'A' && ch = 'a' && ch = 0x4e00 && ch = 0x8000 && ch paraFilter(Map<string> sArray) { Map<string> result = new HashMap<string>(); if (sArray == null || sArray.size() params) { List<string> keys = new ArrayList(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i "); if (!list.isEmpty()) { sb.append(getChildrenText(list)); } sb.append(value); sb.append("" + name + ">"); } } return sb.toString(); } public static InputStream String2Inputstream(String str) { return new ByteArrayInputStream(str.getBytes()); } }</string></string></string></string>
WechatConfig
public class WechatConfig { //小程序appid public static final String appid = ""; //微信支付的商户id public static final String mch_id = ""; //微信支付的商户密钥 public static final String key = ""; //支付成功后的服务器回调url,这里填PayController里的回调函数地址 public static final String notify_url = ""; //签名方式,固定值 public static final String SIGNTYPE = "MD5"; //交易类型,小程序支付的固定值为JSAPI public static final String TRADETYPE = "JSAPI"; //微信统一下单接口地址 public static final String pay_url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; }
私が初めてミニ プログラム支払いに触れたとき、支払い関連のコードをまったく書いたことがなかったので、扱いにくいと感じました。その後、Baidu で情報を検索したり、公式ドキュメントを読んだりして、ついに支払いコントローラーが完成しました。最後に、必ず公式ドキュメントを何度か読んでから、PayControllerのコードと組み合わせてみると、支払いは難しくないことがわかります。
以上がミニ プログラムのバックエンドを作成するには何を使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ホットトピック



