集成支付即一码多付案例(一)
最近公司开发一个一码多付的功能,就是一张二维码能够实现多种支付工具的支付,大致思想可以参照支付宝的这边文档点击打开链接。吐槽下支付宝的开发文档写的真的比微信的好。
具体就是由app产生二维码,链接指向后台处理,链接可以带个订单号等与你业务有关的参数。然后判断扫码客户端来返回各自的支付链接。
String out_trade_no=req.getParameter("out_trade_no");
String user_agent=req.getHeader("user-agent");
if(user_agent.indexOf("MicroMessenger")!=-1){
return "redirect:weixin://wxpay/s/An4baqw";
}else if (user_agent.indexOf("AlipayClient")!=-1) {
return "redirect:https://qr.alipay.com/bavh4wjlxf12tper3a";
}
return "redirect:可以返回到你写的一个页面或者你公司的官网";
这就是后台的核心类,这里如果你们公司app开通了支付功能也可以加上。我们继续说说怎么产生例如:https://qr.alipay.com/bavh4wjlxf12tper3a这样的支付链接,这里先说说支付宝。大家可以先看看支付宝的开发文档。 点击打开链接
真的比较详细,按照他的步骤一部一部来就行了,这里就不讲申请和配置了,主要就是需要配一个密钥,他都有很详细的说明,说下代码部分。
首先你需要下载这个sdk引入你的项目。
然后你可以看这个文档。点击打开链接,这个文档详细的介绍了各个传参的意思,以及返回值,以下是生产二维码支付链接的代码实现:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time_expire= sdf.format(System.currentTimeMillis()+24*60*60*1000);
StringBuilder sb = new StringBuilder();
sb.append("{"out_trade_no":"" + out_trade_no + "",");
sb.append(""total_amount":""+total_amount+"",");
sb.append(""subject":""+subject+"","body":"订单扫码支付",");
sb.append(""store_id":""+store_id+"",");
sb.append(""time_expire":""+time_expire+""}");
AlipayClient alipayClient =new DefaultAlipayClient(AlipayConfig.ALIPAY_GATEWAY, AlipayConfig.APP_ID,
AlipayConfig.private_key, "json","utf-8",AlipayConfig.ali_public_key,AlipayConfig.sign_type);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent(sb.toString());
request.setNotifyUrl("你的回调连接");
AlipayTradePrecreateResponse response = null;
response = alipayClient
.execute(request);
log.info(response.getMsg());
if (null != response && response.isSuccess()) {
if (response.getCode().equals("10000")) {
log.info("二维码值:"+response.getQrCode());
} else {
log.info("错误码:"+response.getSubCode());
log.info("错误描述:"+response.getSubMsg());
}
}
return response.getQrCode();
好了你有了这个支付链接直接重定向过去就好了,然后重点讲下回调,回调的地址是上面设置好的。这里代码删除了部分,可能粘贴过去会跑不通,自行调整。参考这篇文档点击打开链接
log.info("============支付宝支付通知notifyAlipay===============");
try {
Map params = new HashMap();
Map requestParams = request.getParameterMap();
Iterator iter = requestParams.keySet().iterator();
while (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] + ",";
}
params.put(name, valueStr);
}
if (AlipayNotify.verify(params))
{
if (!trade_status.equals("WAIT_BUYER_PAY"))
{
if (trade_status.equals("TRADE_SUCCESS"))
{
result = "SUCCESS";
}
else if (trade_status.equals("TRADE_FINISHED"))
{
log.info("============TRADE_FINISHED===============");
}
}
PrintWriter out = response.getWriter();
out.println(result);
out.flush();
out.close();
}
else
{
log.info("============支付宝通知fail===============");
PrintWriter out = response.getWriter();
out.println("fail");
out.flush();
out.close();
}
} catch (Exception e) {
log.info("============支付宝通知fail===============");
e.printStackTrace();
}
看一下验证和签名部分的代码
public class AlipayNotify {
private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
public static boolean verify(Map<String, String> params) {
String responseTxt = "true";
if(params.get("notify_id") != null) {
String notify_id = params.get("notify_id");
responseTxt = verifyResponse(notify_id);
}
String sign = "";
if(params.get("sign") != null) {sign = params.get("sign");}
boolean isSign = getSignVeryfy(params, sign);
if (isSign && responseTxt.equals("true")) {
return true;
} else {
return false;
}
}
private static boolean getSignVeryfy(Map<String, String> Params, String sign) {
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.ali_public_key, AlipayConfig.input_charset);
}else if(AlipayConfig.sign_type.equals("RSA2")){
isSign = RSA.verify(preSignStr, sign, AlipayConfig.ali_public_key, AlipayConfig.input_charset,"SHA256WithRSA" );
}
return isSign;
}
private static String verifyResponse(String notify_id) {
String partner = AlipayConfig.partner;
String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "¬ify_id=" + notify_id;
return checkUrl(veryfy_url);
}
private 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 static boolean verify(String preSignStr, String sign, String aliPublicKey, String inputCharset,
String string) {
try
{
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = Base64.decode(aliPublicKey);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
java.security.Signature signature = java.security.Signature
.getInstance(string);
signature.initVerify(pubKey);
signature.update( preSignStr.getBytes(inputCharset) );
boolean bverify = signature.verify( Base64.decode(sign) );
return bverify;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
支付宝差不多就这样了,基本就能完成了,后面再说微信。
相关知识
一文看“透”你所不知道在线支付
云闪付APP线上支付操作指南
海南发布6项新一批制度集成创新案例
探究华为支付,揭秘华为自研支付系统及其命名奥秘
华为“花瓣支付”来了!
宝付支付电商行业解决方案,助力双11高效运营
华为旗下支付机构更名:从“迅联智付”到“花瓣支付”
悦支付是个什么平台?悦支付怎么挣钱
电商一般用哪些在线支付方式?
华为“花瓣支付”已实现在鸿蒙系统底层化
网址: 集成支付即一码多付案例(一) https://www.huajiangbk.com/newsview898462.html
上一篇: vue项目token放在哪里 |
下一篇: SAP EPIC 银企直连 回单 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039