银联支付接口研究(Android端和Java服务端)

本文介绍了银联支付接口的研究,按照官方流程,从Android端选择商品传递参数开始,详细讲解了后台发送订单请求获取交易流水号、Android调起支付控件、服务端支付状态通知及验签等关键步骤,强调了验签和安全信息处理的重要性。
摘要由CSDN通过智能技术生成

先来一张官方文档中的流程图
这里写图片描述
同样的,我们会严格按照流程走,会将私钥等安全相关信息放在后台,以前写过的微信,支付宝也是一样,有兴趣可以看一下。

第一步,android端选中购买商品,直接将后台需要的参数传过去。对应于步骤1

    String merId = req.getParameter("merId");
    String txnAmt = req.getParameter("txnAmt");
    String orderId = req.getParameter("orderId");
    String txnTime = req.getParameter("txnTime");

这几个参数将会和接下来的第二步一起说明。

第二步,商户后台向银联全渠道平台发送订单推送请求,并获得交易流水号tn。对应于步骤2,3。
官方demo点我(包括了android端和Java端,我就是依照这个讲的)

 @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    String merId = req.getParameter("merId");
    String txnAmt = req.getParameter("txnAmt");
    String orderId = req.getParameter("orderId");
    String txnTime = req.getParameter("txnTime");

    Map<String, String> contentData = new HashMap<String, String>();

    /***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
    contentData.put("encoding", DemoBase.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式
    contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
    contentData.put("txnType", "01");                       //交易类型 01:消费
    contentData.put("txnSubType", "01");                    //交易子类 01:消费
    contentData.put("bizType", "000201");                   //填写000201
    contentData.put("channelType", "08");                   //渠道类型 08手机

    /***商户接入参数***/
    contentData.put("merId", merId);                        //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    contentData.put("accessType", "0");                     //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
    contentData.put("orderId", orderId);                    //商户订单号,8-40位数字字母,不能含“
以下是一个完整的Java-Spring Boot集成银联充值的逻辑代码案例。这个案例包含了充值请求的处理、支付结果的回调处理以及验签等步骤。 首先,您需要添加银联支付的依赖项。在您的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>com.unionpay</groupId> <artifactId>acp-sdk</artifactId> <version>1.0.0</version> </dependency> ``` 然后,您可以创建一个Controller来处理充值请求和支付结果回调。在这个示例中,我们将使用POST方法来接收充值请求,并使用异步方式接收支付结果回调。 ```java import com.unionpay.acp.sdk.AcpService; import com.unionpay.acp.sdk.LogUtil; import com.unionpay.acp.sdk.SDKConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/payment") public class PaymentController { @Value("${unionpay.merId}") private String merId; // 商户号 @Value("${unionpay.frontUrl}") private String frontUrl; // 前台回调地址 @Value("${unionpay.backUrl}") private String backUrl; // 后台回调地址 @PostConstruct public void init() { // 初始化银联支付配置 SDKConfig.getConfig().loadPropertiesFromSrc(); } @PostMapping("/recharge") public String recharge(@RequestBody RechargeRequest request) { Map<String, String> requestData = new HashMap<>(); requestData.put("version", "5.1.0"); requestData.put("encoding", "UTF-8"); requestData.put("signMethod", "01"); requestData.put("txnType", "01"); requestData.put("txnSubType", "01"); requestData.put("bizType", "000201"); requestData.put("channelType", "08"); requestData.put("merId", merId); requestData.put("accessType", "0"); requestData.put("orderId", request.getOrderId()); requestData.put("txnTime", request.getTxnTime()); requestData.put("txnAmt", request.getTxnAmt()); requestData.put("currencyCode", "156"); requestData.put("frontUrl", frontUrl); requestData.put("backUrl", backUrl); requestData.put("payTimeout", request.getPayTimeout()); Map<String, String> responseData = AcpService.post(requestData, SDKConfig.getConfig().getBackRequestUrl()); if (AcpService.validate(responseData, "UTF-8")) { if ("00".equals(responseData.get("respCode"))) { // 充值成功,处理业务逻辑 return "success"; } else { // 充值失败,处理业务逻辑 return "failure"; } } else { // 验签失败,处理业务逻辑 return "failure"; } } @PostMapping("/callback") public void callback(@RequestBody Map<String, String> params) { if (AcpService.validate(params, "UTF-8")) { if ("00".equals(params.get("respCode"))) { // 支付成功,处理业务逻辑 // TODO: 处理支付成功的业务逻辑 } else { // 支付失败,处理业务逻辑 // TODO: 处理支付失败的业务逻辑 } } else { // 验签失败,处理业务逻辑 // TODO: 处理验签失败的业务逻辑 } } } ``` 在上面的代码中,我们使用了银联提供的SDK来处理充值请求和支付结果回调。在`recharge`方法中,我们调用了银联支付接口进行充值,并根据支付结果进行相应的业务逻辑处理。在`callback`方法中,我们接收支付结果回调,并进行验签和业务逻辑处理。 请注意,上述代码仅提供了一个简单的示例,实际集成银联支付时还需要考虑更多的安全性和错误处理。您可以根据银联提供的开发文档进行更详细的配置和调整。 希望对您有所帮助!如果您有任何疑问,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值