第三方支付宝集成Demo_三方集成时demo-程序员宅基地

package com.alipay.sdk.pay.demo.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

import com.alipay.sdk.pay.demo.SignUtils;

public class OrderInfoUtil2_0 {
	
	/**
	 * 构造授权参数列表
	 * 
	 * @param pid
	 * @param app_id
	 * @param target_id
	 * @return
	 */
	public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) {
		Map<String, String> keyValues = new HashMap<String, String>();

		// 商户签约拿到的app_id,如:2013081700024223
		keyValues.put("app_id", app_id);

		// 商户签约拿到的pid,如:2088102123816631
		keyValues.put("pid", pid);

		// 服务接口名称, 固定值
		keyValues.put("apiname", "com.alipay.account.auth");

		// 商户类型标识, 固定值
		keyValues.put("app_name", "mc");

		// 业务类型, 固定值
		keyValues.put("biz_type", "openservice");

		// 产品码, 固定值
		keyValues.put("product_id", "APP_FAST_LOGIN");

		// 授权范围, 固定值
		keyValues.put("scope", "kuaijie");

		// 商户唯一标识,如:kkkkk091125
		keyValues.put("target_id", target_id);

		// 授权类型, 固定值
		keyValues.put("auth_type", "AUTHACCOUNT");

		// 签名类型
		keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");

		return keyValues;
	}

	/**
	 * 构造支付订单参数列表
	 * @param pid
	 * @param app_id
	 * @param target_id
	 * @return
	 */
	public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2) {
		Map<String, String> keyValues = new HashMap<String, String>();

		keyValues.put("app_id", app_id);

		keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() +  "\"}");
		
		keyValues.put("charset", "utf-8");

		keyValues.put("method", "alipay.trade.app.pay");

		keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");

		keyValues.put("timestamp", "2016-07-29 16:55:53");

		keyValues.put("version", "1.0");
		
		return keyValues;
	}
	
	/**
	 * 构造支付订单参数信息
	 * 
	 * @param map
	 * 支付订单参数
	 * @return
	 */
	public static String buildOrderParam(Map<String, String> map) {
		List<String> keys = new ArrayList<String>(map.keySet());

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < keys.size() - 1; i++) {
			String key = keys.get(i);
			String value = map.get(key);
			sb.append(buildKeyValue(key, value, true));
			sb.append("&");
		}

		String tailKey = keys.get(keys.size() - 1);
		String tailValue = map.get(tailKey);
		sb.append(buildKeyValue(tailKey, tailValue, true));

		return sb.toString();
	}
	
	/**
	 * 拼接键值对
	 * 
	 * @param key
	 * @param value
	 * @param isEncode
	 * @return
	 */
	private static String buildKeyValue(String key, String value, boolean isEncode) {
		StringBuilder sb = new StringBuilder();
		sb.append(key);
		sb.append("=");
		if (isEncode) {
			try {
				sb.append(URLEncoder.encode(value, "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				sb.append(value);
			}
		} else {
			sb.append(value);
		}
		return sb.toString();
	}
	
	/**
	 * 对支付参数信息进行签名
	 * 
	 * @param map
	 *            待签名授权信息
	 * 
	 * @return
	 */
	public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {
		List<String> keys = new ArrayList<String>(map.keySet());
		// key排序
		Collections.sort(keys);

		StringBuilder authInfo = new StringBuilder();
		for (int i = 0; i < keys.size() - 1; i++) {
			String key = keys.get(i);
			String value = map.get(key);
			authInfo.append(buildKeyValue(key, value, false));
			authInfo.append("&");
		}

		String tailKey = keys.get(keys.size() - 1);
		String tailValue = map.get(tailKey);
		authInfo.append(buildKeyValue(tailKey, tailValue, false));

		String oriSign = SignUtils.sign(authInfo.toString(), rsaKey, rsa2);
		String encodedSign = "";

		try {
			encodedSign = URLEncoder.encode(oriSign, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "sign=" + encodedSign;
	}
	
	/**
	 * 要求外部订单号必须唯一。
	 * @return
	 */
	private static String getOutTradeNo() {
		SimpleDateFormat format = new Sim
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39914866/article/details/78745112

智能推荐

优化 WordPress 网站让百度快速收录_wordpress 独立站 百度收录 首图-程序员宅基地

文章浏览阅读2.1k次。百度站长四种提交方式:主动推送:最为快速的提交方式,建议将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。sitemap:可以定期将网站链接放到 Sitemap 中,然后将 Sitemap 提交给百度。百度会周期性的抓取检查提交的 Sitemap,对其中的链接进行处理,但收录速度慢于主动推送。手工提交:如果不想通过程序提交,那么可以采用此种方式,手动将链接提交..._wordpress 独立站 百度收录 首图

FAQ_全志平台Tina系统改用gpt分区表后系统启动异常问题解决方法(Waiting for root device /dev/nand0p3...)_mmc:failed to get gpios-程序员宅基地

文章浏览阅读3k次。FAQ_全志平台Tina系统改用gpt分区表后系统启动异常问题解决方法(Waiting for root device /dev/nand0p3...)【现象】在升级到tina3.0.7使用R328芯片的时候,系统无法启动,报错“Waiting for root device /dev/nand0p3..”[ 4.012988] Hardware nam..._mmc:failed to get gpios

在OpenEulerOS上安装Samba服务_openeuler samba-程序员宅基地

文章浏览阅读2.1k次。安装前可以先检查一下系统中是否已安装Samba,已安装则无需重新安装,因为卸载可能会造成数据丢失或其他错误。没有确切需求的话,低版本也能够满足使用需求。本次基于OpenEularOS系统操作,理论上CentOS7、CentOS8同样适用。- Contents一、熟悉一下二、开始工作一、熟悉一下1、Samba是什么?Samba是运行在Linux和Unix系统之上的一款免费软件,基于SMB协议(Server Messages Block,信息服务快,点击了解)实现,由客户端和服务器组成。2.._openeuler samba

Unity脚本实现——触摸屏3D模型,随单根手指,无死角旋转(Input的GetTouch方法和touchCount属性)_unity3d input.gettouch-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏22次。参考别人随手指绕Y轴转动——添加了绕X轴转动/***/using System.Collections;using System.Collections.Generic;using UnityEngine;public class ScaleAndRotate : MonoBehaviour{ private Touch oldTouch1; //上次触摸点1(手指1) private Touch oldTouch2; //上次触摸点2(手指2) voi_unity3d input.gettouch

LaTeX调整公式中部分字号及行距_latex局部字号-程序员宅基地

文章浏览阅读1.1k次。\text{\Large∗∗∗∗∗*****∗∗∗∗∗} ****为公式修改内容\Large 可替换七号   5.25pt    1.845mm     tiny六号   7.875pt    2.768mm   scriptsize小五号  9pt      3.163mm     footnotesize五号   10.5pt    3.69mm     small小四号  12pt     4.2175mm    normalsize四号   13.75pt    4.8_latex局部字号

centos7.4 用chrony代替ntpd时间同步服务器_package chrony-3.2-2.el7.x86_64 already installed -程序员宅基地

文章浏览阅读2.6k次。 Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确。它由两个程序组成:chronyd和chronyc。 chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。 Chrony 是网络时间协议的另一种实现,与网络时间协议后台程序..._package chrony-3.2-2.el7.x86_64 already installed and latest version

随便推点

交叉编译工具链介绍以及linux源码编译配置_编译工具链的内核版本是什么-程序员宅基地

文章浏览阅读297次。[交叉编译工具链介绍地址]关于交叉编译工具链的介绍,其中eabi的意思是embedded application binary interface。不同的交叉编译工具链用于编译不同的程序。_编译工具链的内核版本是什么

GTD方法在项目管理中的实践_gtps在管理中的运用-程序员宅基地

文章浏览阅读573次。一、背景在推进项目质量管理、配置管理等工作时,积累了一些工作方法,经过归类总结,其主要过程为收集工作数据、理清项目现状、形成方案组织资源、执行工作、制定看板定期回顾深思,这种工作步骤与GTD方法类似,目标也是趋同的,因此整理出具体工作方法形成案例,供以后的项目管理工作参考。二、GTD是什么GTD(Getting Things Done)是一种时间管理的系统性方法,一方面让你全面掌控工作和生活..._gtps在管理中的运用

float属性是如何实现文字环绕效果的_div float居右如何让左侧实现文字围绕图的形式展示-程序员宅基地

文章浏览阅读1.5k次。我们一步步来看看float属性是如何实现文字环绕效果的。先看看子元素不设置float属性:<html> <head><style type="text/css">.div1{ width: 200px; outline: 2px red solid;}.div2{ width: 100px; height: 2..._div float居右如何让左侧实现文字围绕图的形式展示

pytorch的发展历史,与其他框架的联系_torch c++部署发展史-程序员宅基地

文章浏览阅读1.1k次。我一直是这样以为的:pytorch的底层实现是c++(这一点没有问题,见下边的pytorch结构图),然后这个部分顺理成章的被命名为torch,并提供,我们在python中常用的是带有python接口的,所以被称为pytorch。昨天无意中看到Torch是由lua语言写的,这让我十分震惊,完全颠覆了我的想象。所以今天准备查找并记录一下pytorch的发展历史,与其他框架的联系。当然以下列举的部分难以面面俱到,如果您知道哪些有意思的相关知识,请在评论去评论。_torch c++部署发展史

torch.backends.cudnn.benchmark--提升卷积神经网络的运行速度_torch.backens.cudnn.benchmark能提速吗-程序员宅基地

文章浏览阅读1.7w次。大家在训练深度学习模型的时候,经常会使用 GPU 来加速网络的训练。但是说起torch.backends.cudnn.benchmark这个 GPU 相关的 flag,可能有人会感到比较陌生。在一般场景下,只要简单地在 PyTorch 程序开头将其值设置为True,就可以大大提升卷积神经网络的运行速度。既然如此神奇,为什么 PyTorch 不将其默认设置为True?它的适用场景是什么?浓缩版设置torch.backends.cudnn.benchmark=True将会让程序在开始时花费一..._torch.backens.cudnn.benchmark能提速吗

Mysql锁-程序员宅基地

文章浏览阅读85次。一:Mysql支持的锁类型和特点?1:表级锁:开销小,粒度大,加锁快,并发度低,发生锁冲突的概率最高2:行级锁:开销大,粒度小,加锁慢,并发度大,发生锁冲突的概率最低3:页面锁,开销和加锁时间介于表级锁和行级锁之间,会出现死锁。二:不同存储引擎锁支持的锁类型。主要分析inndb和myisam存储引擎。myisam使用的是表级锁,inndb支持的是行级锁好表级锁。2.1:myisam表锁:myisam也有两种锁模式:表共享读锁和表独占写锁。表共享读锁:不会阻塞其他用户对同一张表的读请求。表