前天boss要我们写一个仿微信支付过程的demo.下来和同事讨论了一下,简单一点.
功能主要就两个app,一个负责生成二维码,一个负责扫二维码,再加上个服务器来接收订单数据.
逻辑也十分简单:
1.生成二维码的那个app,在生成的二维码的同时,向服务器提交二维码的信息.
2.服务器收到信息,做成订单并保持,但当前订单状态为"未支付".
3.扫二维码的那个app,扫码获取信息,确认支付后,也发二维码的信息给服务器
4.服务器收到信息,根据订单号找到订单信息,修改状态为"已支付".
5.生成二维码的那个app,此时点击"支付成功",再次发送信息到服务器,以查询订单状态是否为"已支付".是,就返回响应"成功".
(原本是想,在订单状态修改为"已支付"时,利用服务器直接发送成功消息到产生二维码的手机,但没想到有什么方法可以直接找到这个生成二维码的手机(也许我应该把手机消息也包含到二维码里),并且对服务器怎么传出数据给手机,没有清晰的认识,所以就退而求其次了)
其中一个问题就是如何让手机和服务器连接:
1.首先手机要开wifi,电脑要联网,app要有网络权限.
2.然后开始写app端的请求,其中需要注意的一点是连接地址要与服务器的IP地址+端口号吻合,要加http://
private void sendRequestWithHttpClient() {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn=null;
try {
URL url=new URL(webURL);//这里的webURL就是服务器的IP地址和端口号了
conn=(HttpURLConnection) url.openConnection();//使用URL打开一个链接
conn.setRequestMethod("POST");//post方式请求
conn.setConnectTimeout(1000);
conn.setReadTimeout(3000);
conn.setDoInput(true); //允许输入流,即允许下载
conn.setDoOutput(true); //允许输出流,即允许上传
conn.setUseCaches(false); //不使用缓冲
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
out.writeBytes(
fashongsj//这里post方式时,发送的消息字符串,格式为"name=张三&sex=男&tel=10086"
);
InputStream in=conn.getInputStream();//获取输入流,此时才真正建立链接
BufferedReader reader=new BufferedReader(new InputStreamReader(in));//转成字符
final String jieguo=(reader.readLine());//URLEncoder.encode()是转格式,返回的即使是utf-8的字符数据,就不需要转了.jieguo是服务器返回的响应结果.
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭连接
conn.disconnect();
}
}
}).start();
}
3.服务器代码的编写 public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置请求和响应的格式
response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");
中间这里是逻辑处理,用request.getParameter("字符串")来解析请求传递过来的数据.比如:String name2=request.getParameter("name").name2的值为"张三"
PrintWriter out=response.getWriter();//开始设置返回的响应了,我这里返回的是字符串型的数据,可以改成字节的.
out.write(result.toString().trim());//result包含的就是我具体要返回的信息内容了,显然,它是个字符串
out.flush();//刷新
out.close();//关闭