首页 分享 集成支付即一码多付案例(一)

集成支付即一码多付案例(一)

来源:花匠小妙招 时间:2024-12-05 19:59

最近公司开发一个一码多付的功能,就是一张二维码能够实现多种支付工具的支付,大致思想可以参照支付宝的这边文档点击打开链接。吐槽下支付宝的开发文档写的真的比微信的好。

具体就是由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 银企直连 回单

推荐分享